解决Service Intent must be explicit 崩溃问题

原创 2018年04月15日 03:33:58

解决Service Intent must be explicit 崩溃问题

Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.example.wang.ordermanager.OrderService }

今天在写一个app间通信的功能时,出现了些小问题,客户端通过aidl绑定服务端的服务,结果在client端应用启动时出现了崩溃,最初代码是这样写的:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    Intent intent = new Intent("com.example.wang.ordermanager.OrderService");
    bindService(intent, conn, Context.BIND_AUTO_CREATE);
}

错误log如下:

04-15 02:26:19.114 1747-1747/? E/uncaughtException: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.wang.client/com.example.wang.client.MainActivity}: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.example.wang.ordermanager.OrderService }
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2444)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2504)
        at android.app.ActivityThread.access$900(ActivityThread.java:165)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1368)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:150)
        at android.app.ActivityThread.main(ActivityThread.java:5546)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)
     Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.example.wang.ordermanager.OrderService }
        at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1366)
        at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1465)
        at android.app.ContextImpl.bindService(ContextImpl.java:1443)
        at android.content.ContextWrapper.bindService(ContextWrapper.java:604)
        at com.example.wang.client.MainActivity.onCreate(MainActivity.java:68)
        at android.app.Activity.performCreate(Activity.java:6367)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2397)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2504) 
        at android.app.ActivityThread.access$900(ActivityThread.java:165) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1368) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:150) 
        at android.app.ActivityThread.main(ActivityThread.java:5546) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684) 

跟了一下源码,发现在ContextImpl中有如下的判断:

@Override
public boolean bindService(Intent service, ServiceConnection conn,
            int flags) {
    warnIfCallingFromSystemProcess();
    return bindServiceCommon(service, conn, flags, mMainThread.getHandler(),
            Process.myUserHandle());
}
private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags, Handler
            handler, UserHandle user) {
    ...
    validateServiceIntent(service);
    ...
}

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

由此可见,在Android5.0中增加了对intent的判断,因为intent是通过设置action得到的,因此没有Component对象的实例,也没有包名,故而报错。原因找到,增加了一个设置包名的步骤,而且需要是App的包名,而不是Service类所在包的包名,即可顺利解决,代码如下:

Intent intent = new Intent("com.example.wang.ordermanager.OrderService");
        intent.setPackage("com.example.wang.ordermanager");
        bindService(intent, conn, Context.BIND_AUTO_CREATE);

Service教程

剔除繁杂的理论,注重实践,讲解Service的基本使用
  • 2017年03月02日 18:01

结合源码谈谈Activity的exported属性

Activity的exported属性在单个App可能用得比较少,但对于对外接口的Activity或公司内部多个应用间接口调用的设计会有比较大的影响。本文基于android 6.0.1的源码谈谈Act...
  • gorgle
  • gorgle
  • 2016-05-16 00:09:43
  • 6330

androidbug之Error running CaptureActivity: The activity must be exported or contain an intent-filter

一个让我流汗的小Bug
  • csdn_loveQingQing
  • csdn_loveQingQing
  • 2017-05-11 17:42:40
  • 922

import android.support.v7.app.AppCompatActivity; 没有起作用

android studio怎么导入appcompat-v7在项目的build.gradle文件里,用传统的自动依赖处理方式:compile ‘com.Android.support:appcompa...
  • Rcvisual
  • Rcvisual
  • 2018-04-04 11:16:13
  • 286

Error running app: Default Activity Not Found

最近在调试安装Android Widget程序时,碰到Error running app: Default ActivityNot Found。         因为简单的Widget程序,如果不和...
  • ljheee
  • ljheee
  • 2017-04-12 10:47:36
  • 13797

详解Android中AsyncTask的使用

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新...
  • liuhe688
  • liuhe688
  • 2011-06-08 19:00:00
  • 335675

android有用的命令

转载请指明出处:草帽的后花园 文件1:下载 Android Tools详解 aapt aapt即Android Asset Packaging Tool...
  • dengshaolin
  • dengshaolin
  • 2012-12-20 10:49:42
  • 16129

解决Service Intent must be explicit 崩溃问题

解决Service Intent must be explicit 崩溃问题 Caused by: java.lang.IllegalArgumentException: Service Int...
  • wangwofeng1987
  • wangwofeng1987
  • 2018-04-15 03:33:58
  • 53

解决Android 5.0版本之后出现的异常:Service Intent must be explicit

java.lang.IllegalArgumentException: Service Intent must be explicit异常修复: 有些时候我们使用Service的时需要采用隐...
  • yangdeli888
  • yangdeli888
  • 2015-12-18 13:08:46
  • 1056

Service Intent must be explicit的两种解决方法

crash的原因是5.0以上service不能使用隐式intent启动,但是使用AIDL进行进程间通信时并不能得到具体的类名,so, 问题还得解决。方法一最简单的是新建Intent的时候带入packa...
  • ethanhola
  • ethanhola
  • 2017-02-03 18:20:55
  • 405
收藏助手
不良信息举报
您举报文章:解决Service Intent must be explicit 崩溃问题
举报原因:
原因补充:

(最多只允许输入30个字)