为了账号安全,请及时绑定邮箱和手机立即绑定

android5.0之后版本服务出现的显示问题解决方案

标签:
Android

一,概述

       Android系统升级到5.0之后做了不少的变化(5.0变化),开发人员一定要注意这些变化,要不然就有的折腾了。这次最大的变化应该是把Dalvik虚拟机改成了ART运行时),后续会专门讲解这一块。其他的都是一些零碎的问题,例如前段时间发了一篇Android 5.0之后修改了HashMap的实现(传送门)。这篇主要讲一下遇到跟服务相关的问题。

二。详情

       服务身为Android四大组件之一,它的使用频率还是比较高的,并且现在主要都是运用在比较关键的部位,例如升级推送等。在Android 5.0之后google出于安全的角度禁止了隐式声明意图来启动服务。也禁止使用Intent过滤器。否则就会抛出异常出来。

解决方式一:

1 将隐式启动转换为显式启动,兼容编译sdk5.0以后版本

//将隐式启动转换为显式启动,兼容编译sdk5.0以后版本
public Intent getExplicitIntent(Context context,Intent implicitIntent){
   PackageManager pm = context.getPackageManager();
   List<ResolveInfo> resolveInfos = pm.queryIntentServices(implicitIntent, 0);
   if (resolveInfos == null || resolveInfos.size()!= 1) {
      return null;
   }
   Intent explicitIntent = null;
   ResolveInfo info = resolveInfos.get(0);
   String packageName = info.serviceInfo.packageName;
   String className = info.serviceInfo.name;
   ComponentName component = new ComponentName(packageName,className);
   explicitIntent = new Intent(implicitIntent);
   explicitIntent.setComponent(component);
   return explicitIntent;
}

复制以上方法

直接使用

//设别服务连接桥
   private ServiceConnection conn = new ServiceConnection(){
      @Override
      public void onServiceConnected(ComponentName name, IBinder serviceBinder) {
         LogUtils.d("aidlService服务连接成功");
         if(serviceBinder != null){ //绑定成功
            AidlDeviceService serviceManager = AidlDeviceService.Stub.asInterface(serviceBinder);
            onDeviceConnected(serviceManager);
         }
      }
      @Override
      public void onServiceDisconnected(ComponentName name) {
         LogUtils.d("AidlService服务断开了");
      }
   };

   //绑定服务
   public void bindService(){

      BaseMainActivity.this.bindService(getExplicitIntent(this,new Intent(LKL_SERVICE_ACTION)),
            conn, Context.BIND_AUTO_CREATE);

      //5.0以后的版本会抛出异常方法已被淘汰
//    Intent intent = new Intent();
//    intent.setAction(LKL_SERVICE_ACTION);
//    intent.setPackage("");
//    boolean flag = bindService(intent, conn, Context.BIND_AUTO_CREATE);
//    if(flag){
//       LogUtils.d("服务绑定成功");
//    }else{
//       LogUtils.d("服务绑定失败");
//    }

   }




解决方式二:直接写上包名和标示


 Intent intent = new Intent("com.gnss.GNSSService");
            intent.setAction(GPSBOARDCONTROL);//Service能够匹配的Action
            intent.setPackage("com.gnss.ssserver");//应用的包名
            context.bindService(intent,serviceConnection, Context.BIND_AUTO_CREATE);

判断应用是否安装的方法:

复制代码

    //判断应用是否安装
    public boolean isAppInstalled(Context context, String packageName) {  
        final PackageManager packageManager = context.getPackageManager();  
        List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);  
        if (pinfo != null) {  
            for (int i = 0; i < pinfo.size(); i++) {  
                if (pinfo.get(i).packageName.contains(packageName)) {                    return true;
                }
            }  
        }  
        return false;  
    }




原文链接:http://www.apkbus.com/blog-839077-67993.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消