java.lang.IllegalArgumentException: Service Intent must be explicit: Intent {

来源:互联网 发布:java多线程 单例 编辑:程序博客网 时间:2024/06/07 14:28

报错信息:

04-29 16:44:25.159: E/AndroidRuntime(15366): FATAL EXCEPTION: main04-29 16:44:25.159: E/AndroidRuntime(15366): Process: com.xz.z.ecarservice, PID: 1536604-29 16:44:25.159: E/AndroidRuntime(15366):<span style="color:#ff0000;"> java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=PushServer (has extras) }</span>04-29 16:44:25.159: E/AndroidRuntime(15366): at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1782)04-29 16:44:25.159: E/AndroidRuntime(15366): at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1811)04-29 16:44:25.159: E/AndroidRuntime(15366): at android.app.ContextImpl.startService(ContextImpl.java:1795)04-29 16:44:25.159: E/AndroidRuntime(15366): at android.content.ContextWrapper.startService(ContextWrapper.java:516)04-29 16:44:25.159: E/AndroidRuntime(15366): xx.activity.LoginActivity$LoginAsyncTask.onPostExecute(LoginActivity.java:176)04-29 16:44:25.159: E/AndroidRuntime(15366): xx.activity.LoginActivity$LoginAsyncTask.onPostExecute(LoginActivity.java:1)04-29 16:44:25.159: E/AndroidRuntime(15366): at android.os.AsyncTask.finish(AsyncTask.java:636)04-29 16:44:25.159: E/AndroidRuntime(15366): at android.os.AsyncTask.access$500(AsyncTask.java:177)04-29 16:44:25.159: E/AndroidRuntime(15366): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)04-29 16:44:25.159: E/AndroidRuntime(15366): at android.os.Handler.dispatchMessage(Handler.java:102)04-29 16:44:25.159: E/AndroidRuntime(15366): at android.os.Looper.loop(Looper.java:141)04-29 16:44:25.159: E/AndroidRuntime(15366): at android.app.ActivityThread.main(ActivityThread.java:5451)04-29 16:44:25.159: E/AndroidRuntime(15366): at java.lang.reflect.Method.invoke(Native Method)04-29 16:44:25.159: E/AndroidRuntime(15366): at java.lang.reflect.Method.invoke(Method.java:372)04-29 16:44:25.159: E/AndroidRuntime(15366): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:910)04-29 16:44:25.159: E/AndroidRuntime(15366): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:705)

解决方案:

有些时候我们使用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的actionmIntent.setPackage(getPackageName());//这里你需要设置你应用的包名context.startService(mIntent);

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

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


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

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;    } 

//调用方式如下:
Intent mIntent = new Intent();mIntent.setAction("XXX.XXX.XXX");Intent eintent = new Intent(getExplicitIntent(mContext,mIntent));context.startService(eintent);


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝上买了假货找不到商家怎么办 魅蓝手机一直在开机画面怎么办 在实体店买的手机想退怎么办 淘宝买了东西发货了不想要了怎么办 快递已经发货了不想要了怎么办 锤子手机买了不到十天碎屏了怎么办 唯品会新人专享优惠卷过期了怎么办 我微信被系统说赌博登陆不起怎么办 平湖新居民积分卡怎么办办好办吗 电话卡插上去只能打紧急电话怎么办 不小心充错q币了怎么办 液相色谱柱堵了怎么办处理柱子 扣扣空间宠物消消87关怎么办 微信钱包里的钱忘记密码了怎么办 支付宝绑定银行卡要验证码怎么办 微信红包超出20万限额怎么办 微信充电信的号码话费没到账怎么办 农业银行手机银行转账转错了怎么办 微信钱包里的零钱不见了怎么办 买家说支付宝没钱要微信付钱怎么办 微信红包没绑卡密码忘了怎么办 手机微信红包密码忘了怎么办 qq账号忘了怎么办什么也没绑定 手机银行转账名字对卡号错了怎么办 手机夸行转账卡号输入错了怎么办 移动开通了20元流量卡怎么办? 联通手机充值卡网上充值话费怎么办 提现金额和实际到账不一样怎么办 二冲踏板冷车加油熄火怎么办? qq被盗绑定了别人的银行卡怎么办 如何更改微信支付密码忘记了怎么办 微信钱包没绑银行卡忘记密码怎么办 微信密码忘记了也没绑银行卡怎么办 微信支付密码忘记了没银行卡怎么办 想找回原来的k歌忘了密码怎么办 手机微信钱包支付密码忘了怎么办 微信支付账户被注销了怎么办 微信钱包密码忘了怎么办没绑银行卡 微信钱包密码忘了怎么办不用银行卡 企业网银密码输入三次错误怎么办 微信密码不知道手机也停用了怎么办