关闭

java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=xxx}

379人阅读 评论(0) 收藏 举报
分类:

有些时候我们使用Service的时需要采用隐私启动的方式,但是Android 5.0一出来后,其中有个特性就是Service Intent must be explitict,也就是说从Lollipop开始,service服务必须采用显示方式启动。
而android源码是这样写的(源码位置:sdk/sources/android-21/android/app/ContextImpl.java):

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

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

1、设置Action和packageName:

参考代码如下:

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

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

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

2、将隐式启动转换为显示启动:–参考地址:http://stackoverflow.com/a/26318757/1446

public static Intent getExplicitIntent(Context context, Intent implicitIntent) {
// Retrieve all services that can match the given intent
PackageManager pm = context.getPackageManager();
List 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;
}

调用方式如下:

Intent mIntent = new Intent();
mIntent.setAction("XXX.XXX.XXX");
Intent eintent = new Intent(getExplicitIntent(mContext,mIntent));
context.startService(eintent);
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android5.0以上的服务要显式调用/关于时间差问题/判断程序是否在前台

这几天遇到了两个小问题,我在这里记录下: 一、服务报如下异常: java.lang.IllegalArgumentException: Service Intent must be explicit:...
  • nzzl54
  • nzzl54
  • 2017-02-15 16:54
  • 189

《Android中级工程师》Service启动流程

前几天深入研究了Activity的启动流程之后,尝到了研究源码的甜头,趁热打铁,准备把四大组件都研究一遍,今天来研究研究Service的启动流程,由于Service可以通过start和bind方式来启...
  • qq_28147169
  • qq_28147169
  • 2017-11-21 10:56
  • 88

Android开发中一些疑难异常解决

Android开发中总是会遇到一些奇奇怪怪的问题,有时真不知如何下手。点滴经验,重在积累。分享我在实际开发中遇到的一些问题,以后还会继续添加或者有单独篇幅进行分析。
  • ada_dengpan
  • ada_dengpan
  • 2016-01-22 11:49
  • 867

Android开发遇到的细节问题(一)

1 为什么按钮XML绑定的点击事件出错,或者无效? 例如: <Button xmlns:android="http://schemas.android.com/apk/res/android" ...
  • computer165
  • computer165
  • 2013-09-28 20:37
  • 2881

Android4.2中应用接收开机广播(android.intent.action.BOOT_COMPLETED)失败的原因

android4.2系统中是在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java的
  • sckgenius
  • sckgenius
  • 2014-06-13 14:15
  • 21702

Android 5.0及更高系统使用AIDL的问题

如果你是刚刚使用AIDL的新手, 一定发现在网上找到的其他关于AIDL的资料都是基于较早平台下的(Android 5.0以前). 其代码在更高平台会出现一个比较麻烦的问题, 我花费了好长时间才弄清楚解...
  • ymjiang820
  • ymjiang820
  • 2015-12-22 08:03
  • 1622

android 6.0 以后的动态权限管理

在android 6.0 以后的系统中授权管理已经和以前有了重大的不同了。以前我们做android是直接在AndroidManifest里面加上就OK了。不过现在不同了。需要用户在使用的过程中进行动态...
  • aicfeng_liuy
  • aicfeng_liuy
  • 2016-09-14 10:33
  • 5316

使用intent来启动activity

Intent最常见的用途是绑定应用程序组件,并在应用程序
  • howlaa
  • howlaa
  • 2014-06-08 23:18
  • 2912

【移动开发】Service类onStartCommand()返回值和参数

Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStart...
  • manoel
  • manoel
  • 2014-10-15 13:32
  • 10378

android 启动模式(二)

FLAG_GRANT_READ_URI_PERMISSION 如果设置这个标记,Intent的接受者将会被赋予读取Intent中URI数据的权限和lipData中的URIs的权限。当应用与Intent...
  • new_abc
  • new_abc
  • 2013-10-30 11:46
  • 4985
    个人资料
    • 访问:70187次
    • 积分:1459
    • 等级:
    • 排名:千里之外
    • 原创:66篇
    • 转载:28篇
    • 译文:0篇
    • 评论:20条
    最新评论