美文网首页
android: targetSdkVersion 引起的问题

android: targetSdkVersion 引起的问题

作者: nancymi | 来源:发表于2015-10-28 23:52 被阅读6113次

    在 Android 5.0 以上 Service 调用出现了一个比较有影响力的特性:Service Intent must be explicit。也就是说,Service 必须显式启动。否则会报错。

    在官方网站和网上都查了一下,解决的办法有两种:

    • 设置 packageNameAction

        Intent mIntent = new Intent();
        mIntent.setAction("XXX.XXX.XXX");   //定义的 Service 的 Action
        mIntent.setPackage(getPackageName());   //设置为应用的包名
        context.startService(mIntent);
      
    • 将隐式启动转换为显式启动,方法如下:

        public static Intent getExplicitIntent(Context context, Intent implicitIntent) {
          // Retrieve all services that can match the given intent
          PackageManager pm = context.getPackageManager();
          List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0);
          // Make sure only one match was found
          if (resolveInfo == null || resolveInfo.size() != 1) {
            return null;
          }
          // Get component info and create ComponentName
          ResolveInfo serviceInfo = resolveInfo.get(0);
          String packageName = serviceInfo.serviceInfo.packageName;
          String className = serviceInfo.serviceInfo.name;
          ComponentName component = new ComponentName(packageName, className);
          // Create a new intent. Use the old one for extras and such reuse
          Intent explicitIntent = new Intent(implicitIntent);
          // Set the component to be explicit
          explicitIntent.setComponent(component);
          return explicitIntent;
        }
      

    这两种方法都是通过改变代码的方式解决的,不过由于我引用的是一个外部的framework,无法对代码进行修改,在进行一番探索之后,发现修改 AndroidManifest.xmltargetSdkVersion 在 21 以下就可以了!虽然问题解决了,但是原理没有搞懂,在查了一系列资料以后,大概得出这样一个结论(也许不是准确的,欢迎指正):

    targetSdkVersion 的作用只是告诉你这个项目在这个目标版本下运行是经过测试的,没有问题,不用再开启兼容性检查了,这样做的效果是能够一定程度上提高运行效率。这样在运行的时候,就会直接使用该版本的处理方式调用 Service,但是由于在该版本下不允许隐式调用,所以程序会崩溃。但是修改了 targetSdkVersion 以后,程序不能保证你在 5.0 以上还是能正常运行,所以在我的观点看来,这里应该是强制使用了 5.0 以下的 Service 调用方式,所以程序能够正常运行。

    目前经过测试只发现了这一种解决方法,在后期我会持续跟进这个问题,以求能够更深入地了解 Android 在处理这个问题时的内部机制。

    资料链接 :

    相关文章

      网友评论

          本文标题:android: targetSdkVersion 引起的问题

          本文链接:https://www.haomeiwen.com/subject/vutfhttx.html