Android5.0以后隐式启动ServiceBug

Posted fanfan-公众号-码农修仙儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android5.0以后隐式启动ServiceBug相关的知识,希望对你有一定的参考价值。

以前写过一篇关于进程间通信的博客

通信之进程间通信-AIDL


当时用的还是4.2的系统,跨进程 的服务可以根据action进行启动

                Intent intent = new Intent();

                intent.setAction("android.intent.action.aidl.server");

但是现在用6.0时发现报错

01-06 01:54:14.140: : Process: com.fang.zrf.clientdemo, PID: 18507
01-06 01:54:14.140: : java.lang.IllegalArgumentException: Service Intent must be explicit: 
                                            Intent  act=android.intent.action.aidl.server 
01-06 01:54:14.140: : 	at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1209)
01-06 01:54:14.140: : 	at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1308)
01-06 01:54:14.140: : 	at android.app.ContextImpl.bindService(ContextImpl.java:1286)
01-06 01:54:14.140: : 	at android.content.ContextWrapper.bindService(ContextWrapper.java:604)
01-06 01:54:14.140: : 	at com.fang.zrf.clientdemo.MainActivity.onClick(MainActivity.java:70)
01-06 01:54:14.140: : 	at android.view.View.performClick(View.java:5205) 

报错之处service的intent必须是明确的,显示的指出。这时候如果是在同一个应用中可以调用类名启动,那如果是不在同一个应用中之能通过service的路劲来调用了。

可以通过setComponent来调用

intent.setComponent(new ComponentName("com.fang.zrf.serverdemo",  "com.fang.zrf.serverdemo.CustomService"));

也可以通过

intent.setClassName("com.fang.zrf.serverdemo",  "com.fang.zrf.serverdemo.CustomService");

来调用,因为本质上是一样的setClassName源码也是创建了ComponentName对象

public Intent setClassName(String packageName, String className) 
        mComponent = new ComponentName(packageName, className);
        return this;
    


其实思路就是通过packagename 和classname来调用,方法有好多。















以上是关于Android5.0以后隐式启动ServiceBug的主要内容,如果未能解决你的问题,请参考以下文章

android 在5.0以后不允许使用隐式Intent方式来启动Service

跨应用启动Service并传递数据

解决Android5.0以后DataPicker选择时间无效的bug。

Android5.0新特性之——动画效果1涟漪效果

[Android]Android5.0实现静默接听电话功能

android5.0 模块编译--art的模块编译小发现