如何解决Android 5.0中出现的警告:Service Intent must be explicit

简介: 如何解决Android 5.0中出现的警告:Service Intent must be explicit

有些时候我们使用Service的时需要采用隐私启动的方式,但是Android 5.0一出来后,其中有个特性就是Service Intent  must be explitict,也就是说从Lollipop开始,service服务必须采用显示方式启动。

而android源码是这样写的(源码位置:sdk/sources/android-21/android/app/ContextImpl.java):

  1. private void validateServiceIntent(Intent service) {
  2.        if (service.getComponent() == null && service.getPackage() == null) {
  3.            if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.LOLLIPOP) {
  4.                IllegalArgumentException ex = new IllegalArgumentException(
  5.                        "Service Intent must be explicit: " + service);
  6.                throw ex;
  7.            } else {
  8.                Log.w(TAG, "Implicit intents with startService are not safe: " + service
  9.                        + " " + Debug.getCallers(2, 3));
  10.            }
  11.        }
  12.    }

复制代码

既然,源码里是这样写的,那么这里有两种解决方法:


1、设置Action和packageName:


参考代码如下:

  1. Intent mIntent = new Intent();
  2. mIntent.setAction("XXX.XXX.XXX");//你定义的service的action
  3. mIntent.setPackage(getPackageName());//这里你需要设置你应用的包名
  4. context.startService(mIntent);

复制代码

 

此方式是google官方推荐使用的解决方法。


在此附上地址供大家参考:http://developer.android.com/goo ... tml#billing-service,有兴趣的可以去看看。


2、将隐式启动转换为显示启动--参考地址:Google In-App billing, IllegalArgumentException: Service Intent must be explicit, after upgrading to Android L Dev Preview - Stack Overflow

  1. public static Intent getExplicitIntent(Context context, Intent implicitIntent) {
  2.        // Retrieve all services that can match the given intent
  3.        PackageManager pm = context.getPackageManager();
  4.        List resolveInfo = pm.queryIntentServices(implicitIntent, 0);
  5.        // Make sure only one match was found
  6.        if (resolveInfo == null || resolveInfo.size() != 1) {
  7.            return null;
  8.        }
  9.        // Get component info and create ComponentName
  10.        ResolveInfo serviceInfo = resolveInfo.get(0);
  11.        String packageName = serviceInfo.serviceInfo.packageName;
  12.        String className = serviceInfo.serviceInfo.name;
  13.        ComponentName component = new ComponentName(packageName, className);
  14.        // Create a new intent. Use the old one for extras and such reuse
  15.        Intent explicitIntent = new Intent(implicitIntent);
  16.        // Set the component to be explicit
  17.        explicitIntent.setComponent(component);
  18.        return explicitIntent;
  19.    }

复制代码

调用方式如下:

  1. Intent mIntent = new Intent();
  2. mIntent.setAction("XXX.XXX.XXX");
  3. Intent eintent = new Intent(getExplicitIntent(mContext,mIntent));
  4. context.startService(eintent);


相关文章
|
6月前
|
JavaScript Java Maven
云效产品使用常见问题之android sdk 构建出aar后,上传到私有maven仓库失败如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
6月前
|
Android开发
Android 11 添加Service服务SELinux问题
Android 11 添加Service服务SELinux问题
352 1
|
5月前
|
调度 Android开发
43. 【Android教程】服务:Service
43. 【Android教程】服务:Service
59 2
|
1月前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
76 0
|
6月前
|
Android开发
Android Service Call /dev/xxx SELinux
Android Service Call /dev/xxx SELinux
109 1
|
3月前
|
编解码 网络协议 Android开发
Android平台GB28181设备接入模块实现后台service按需回传摄像头数据到国标平台侧
我们在做Android平台GB28181设备对接模块的时候,遇到这样的技术需求,开发者希望能以后台服务的形式运行程序,国标平台侧没有视频回传请求的时候,仅保持信令链接,有发起视频回传请求或语音广播时,打开摄像头,并实时回传音视频数据或接收处理国标平台侧发过来的语音广播数据。
|
3月前
|
Java Android开发 UED
安卓scheme_url调端:如果手机上多个app都注册了 http或者https 的 intent。 调端的时候,调起哪个app呢?
当多个Android应用注册了相同的URL Scheme(如http或https)时,系统会在尝试打开这类链接时展示一个选择对话框,让用户挑选偏好应用。若用户选择“始终”使用某个应用,则后续相同链接将直接由该应用处理,无需再次选择。本文以App A与App B为例,展示了如何在`AndroidManifest.xml`中配置对http与https的支持,并提供了从其他应用发起调用的示例代码。此外,还讨论了如何在系统设置中管理这些默认应用选择,以及建议开发者为避免冲突应注册更独特的Scheme。
|
6月前
|
存储 监控 Java
Android Service之设备存储空间监控 DeviceStorageMonitorService
Android Service之设备存储空间监控 DeviceStorageMonitorService
134 2
|
6月前
|
Android开发 数据库管理
Android如何在Activity和Service之间传递数据
Android如何在Activity和Service之间传递数据
301 3
|
6月前
|
定位技术 Android开发
Intent在Android中的几种用法
Intent在Android中的几种用法
79 1