一 问题描写叙述

Android L[Android5.X.X] 版本号通过Intent隐式启动service时将会报出下面错误:

AndroidRuntime(  792):
java.lang.IllegalArgumentException: Service Intent must be explicit

【声明】欢迎转载,但请保留文章原始出处:http://blog.csdn.net/yelangjueqi/article/details/46754581



具体信息:

01-02 07:52:44.736 D/PowerManagerService/SmartStandby(  792): sendDetectFaceIntent:com.wtk.smart.standby.DETECT_FACE_ACTION

01-02 07:52:44.738 W/ContextImpl(  792): Calling a method in the system process without a qualified user: android.app.ContextImpl.startService:1813 com.android.server.power.PowerManagerService.sendDetectFaceIntent:4155 com.android.server.power.PowerManagerService.handleDetectFaceCase:4137
com.android.server.power.PowerManagerService.access$4400:100 com.android.server.power.PowerManagerService$PowerManagerHandler.handleMessage:3306

01-02 07:52:44.744 E/AndroidRuntime(  792): *** FATAL EXCEPTION IN SYSTEM PROCESS: PowerManagerService

01-02 07:52:44.744 E/AndroidRuntime(  792): java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.wtk.smart.standby.DETECT_FACE_ACTION (has extras) }

01-02 07:52:44.744 E/AndroidRuntime(  792):  at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1801)

01-02 07:52:44.744 E/AndroidRuntime(  792):  at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1830)

01-02 07:52:44.744 E/AndroidRuntime(  792):  at android.app.ContextImpl.startService(ContextImpl.java:1814)

01-02 07:52:44.744 E/AndroidRuntime(  792):  at com.android.server.power.PowerManagerService.sendDetectFaceIntent(PowerManagerService.java:4155)

01-02 07:52:44.744 E/AndroidRuntime(  792):  at com.android.server.power.PowerManagerService.handleDetectFaceCase(PowerManagerService.java:4137)

01-02 07:52:44.744 E/AndroidRuntime(  792):  at com.android.server.power.PowerManagerService.access$4400(PowerManagerService.java:100)

01-02 07:52:44.744 E/AndroidRuntime(  792):  at com.android.server.power.PowerManagerService$PowerManagerHandler.handleMessage(PowerManagerService.java:3306)

01-02 07:52:44.744 E/AndroidRuntime(  792):  at android.os.Handler.dispatchMessage(Handler.java:111)

01-02 07:52:44.744 E/AndroidRuntime(  792):  at android.os.Looper.loop(Looper.java:194)

01-02 07:52:44.744 E/AndroidRuntime(  792):  at android.os.HandlerThread.run(HandlerThread.java:61)

01-02 07:52:44.744 E/AndroidRuntime(  792):  at com.android.server.ServiceThread.run(ServiceThread.java:46)

01-02 07:52:44.752 V/SettingsProvider(  792): call(global:dropbox:system_server_crash) for 0

01-02 07:52:44.753 D/SettingsProvider(  792): lookupValue table global cache.fullyMatchesDisk() dropbox:system_server_crash

01-02 07:52:44.757 V/SettingsProvider(  792): call(global:logcat_for_system_server_crash) for 0

01-02 07:52:44.757 D/SettingsProvider(  792): lookupValue table global cache.fullyMatchesDisk() logcat_for_system_server_crash

二 问题分析

A . 定位问题点

sdk\sources\android-21\android\app\ContextImpl.java

class ContextImpl extends Context {

 ......

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

            }

        }

    }

 ......

}

B .分析过程

上面源代码中蓝色加粗部分:service.getComponent() == null && service.getPackage() == null

表明通过intent启动service时, 须要指定Intent的ComponentName信息:intent.setComponent(xxx),或指定Intent的setPackage("包名"),假设两者都没有指定的话将会报以上错误。尤其在framework层启动APP层的service时。假设是隐式启动service,可能会导致系统进程挂掉。出现不断重新启动的现象。

三 解决方法

參考一

Intent intent = new Intent();

    ComponentName componentName = new ComponentName(pkgName,serviceName);

    intent.setComponent(componentName);

    context.startService(intent);

參考二

Intent mIntent = new Intent();

mIntent.setAction("XXX.XXX.XXX");//Service可以匹配的Action

mIntent.setPackage(pkgName);//应用的包名

context.startService(mIntent);

四 延伸官网

Binding to a Service

The Context.bindService() method now requires an explicit Intent, and throws an exception if given an implicit intent. To ensure your app is secure, use an explicit intent when starting or binding your Service, and do not declare intent filters for the service.

也就是说。在5.0以后不同意使用隐式Intent方式来启动Service

[Android L]关于Android L的Service启动问题的更多相关文章

  1. android中service启动后台程序

    Service是Android中一个类,它是Android四大组件之一,使用Service可以在后台执行长时间的操作( perform long-running operations in the b ...

  2. 转Android service 启动篇之 startForegroundService

    本文转自:https://blog.csdn.net/shift_wwx/article/details/82496447 前言: 在官方文档 Android 8.0 行为变更 中有这样一段话: An ...

  3. Android Service 启动和停止服务

    activity_main.xml 定义两个Button控件,start_service和stop_service. <LinearLayout xmlns:android="http ...

  4. Android 四大组件之再论service

    service常见的有2种方式,本地service以及remote service. 这2种的生命周期,同activity的通信方式等,都不相同. 关于这2种service如何使用,这里不做介绍,只是 ...

  5. Android 综合揭秘 —— 全面剖释 Service 服务

    引言 Service 服务是 Android 系统最常用的四大部件之一,Android 支持 Service 服务的原因主要目的有两个,一是简化后台任务的实现,二是实现在同一台设备当中跨进程的远程信息 ...

  6. Android组件系列----Android Service组件深入解析

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  7. Android基调(十六)- Service:startService()、stopService()、bindService()、unbindService()加

    直行 第一 另外一种 第三种 总结 开门见山 开启服务有三种情况:假设直接使用服务,则没有必要进行绑定,可是假设要使用服务里面的方法.则要进行绑定. 具体的启动情况有下: ①调用startServic ...

  8. Android Binder分析二:Natvie Service的注冊

    这一章我们通过MediaPlayerService的注冊来说明怎样在Native层通过binder向ServiceManager注冊一个service,以及client怎样通过binder向Servi ...

  9. Android中startService的使用及Service生命周期

    Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法.本文仅仅探讨纯startService的使用.不 ...

  10. Android 7.1.1 锁屏界面启动流程

    前几天遇到一个低概率复现锁屏界面不显示,仅仅显示状态栏的问题,跟了下锁屏界面启动显示的流程,在这分享下,也方便以后自己查看.前面简介了下Zygote启动流程, Zygote进程启动后会首先创建一个Sy ...

随机推荐

  1. HTMLTestRunner美化

    https://www.cnblogs.com/findyou/p/6925733.html 参考这个,美化的不错,进入了汉化,及加入了一些样式,

  2. new AppiumDriver<>(new URL(url), capabilities) 报错 java.lang.NoSuchMethodError: com.google.common.base.Throwables.throwIfUnchecked(Ljava/lang/Throwable;)V

    2017-10-11 17:37:02.102 INFO c.u.a.r.PrepareDriver:41 - appium server url : http://127.0.0.1:4723/wd ...

  3. 阻止 gulp 发生异常后退出

    gulp-plumber 可以阻止 gulp 插件发生错误导致进程退出并输出错误日志.

  4. 转:Android推送技术研究

    Android推送技术研究 字数5208 阅读4026 评论5 喜欢35 前言 最近研究Android推送的实现, 研究了两天一夜, 有了一点收获, 写下来既为了分享, 也为了吐槽. 需要说明的是有些 ...

  5. 如何注册ocx文件

    32位系统: 将文件放到c:\windows\system目录注册 运行:Regsvr32 c:\windows\system\xxx.ocx取消注册运行:Regsvr32.exe /u c:\win ...

  6. 绘制 SVG

    工具网址:http://svg123.com/ 画布 点击画布,在页面的右侧我们可以调整画布属性 点击属性,滚动滑轮可以微调 或者直接双击修改属性值 工具栏 左侧工具栏 就像画图的工具栏一样 形状库 ...

  7. iOS 自定义转场动画

    代码地址如下:http://www.demodashi.com/demo/12955.html 一.总效果 本文记录分享下自定义转场动画的实现方法,具体到动画效果:新浪微博图集浏览转场效果.手势过渡动 ...

  8. MySQL学习总结(一)下载与安装

    关于数据库这块平时用的也就是Oracle和SQL Server,关于别的数据库也就是耳闻,但从没有用过.所以,最近一直都在学习使用MySQL数据库,这个教程也是通过记录博客,增加学习的印象. 关于My ...

  9. tcpdump抓包(转)

    Linux 环境下,通常通过 tcpdump 来进行抓包和分析.它是几乎所有 Linux 发行版本预装的数据包抓取和分析工具. tcpdump 工具的获取和安装可以参阅相应操作系统的官方文档,本文不再 ...

  10. TCP通过哪些措施,保证传输可靠

    TCP是通过什么方式来提供可靠传输的 (合理截断数据包,超时重发,校验,失序重新排序,能够丢弃重复数据,TCP可以进行流量控制) TCP提供一种面向连接的.可靠的字节流服务.  面向连接:意味着两个使 ...