Android [Android5.X.X]关于Android L的Service启动问题

一 问题描述

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 08:44:50

Android [Android5.X.X]关于Android L的Service启动问题的相关文章

Android高级编程笔记(八)深入分析Service启动、绑定过程

Service是Android中一个重要的组件,它没有用户界面,可以运行在后太做一些耗时操作.Service可以被其他组件启动,甚至当用户切换到其他应用时,它仍然可以在后台保存运行.Service 是Android四大组件中与Activity最相似的组件,都代表可执行的程序,区别在于:Service一直运行在后台,没有界面,一旦Service被启动,即完全具有自己的生命周期. 一.创建一个Service 在创建Service时,步骤与Activity很像: 1.继承Service,创建Servi

Android [Android5.X.X]解除SwitchPreference与Preference的绑定事件

需求描述 默认情况,Android的两个控件SwitchPreference和CheckBoxPreference的事件处理是和Preference整个区域的事件绑定在一起的,然而,有时需要将其事件分开处理,即点击Preference整个区域时,不会改变SwitchPreference状态,仅当点击SwitchPreference时才去处理SwitchPreference的开关状态,如点击Preference整个区域弹出一个对话框或跳转到某个界面,点击SwitchPreference时仅是改变开

Android 面试题总结之Android 进阶(一)

Android 面试题总结之Android 进阶(一) 在前几篇文章中都是讲的基础,大家应该会觉得非常熟悉,但往往我们可能对于基础某些细节认识不够彻底或贯穿不全,我一直认为基础都是比较难的,那么本章节终于到进阶啦,主要讲的是View 的相关知识,在前面<Android 面试题总结之Android 基础 (六)>中已经对View有了一定的了解,由于内容较多且也是面试必考题,所以将分两篇继续深入的理解View. 在阅读过程中有任何问题,请及时联系.如需转载请注明 fuchenxuan de Blo

Android Studio常用快捷键、Android Studio快捷键大全

Android Studio 是谷歌基于IntelliJ IDEA开发的安卓开发工具,有点类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试,基于Gradle的构建支持. Android Studio常用快捷键 1. Ctrl+D: 集合了复制和粘贴两个操作,如果有选中的部分就复制选中的部分,并在选中部分的后面 粘贴出来,如果没有选中的部分,就复制光标所在的行,并在此行的下面粘贴出来. 2. Ctrl+空格: 输入代码时按此组合键会列

Android开发学习之路-Android Design Support Library使用(CoordinatorLayout的使用)

效果图: 上面的这个图有两个效果是,一个是顶部的图片,在上滑之后会隐藏起来并且显示出一个ToolBar(ToolBar类似于ActionBar,但是只有ToolBar是兼容Material Desig的库).另一个是底部的这个按钮,这个按钮点击之后会出现一个SnackBar(比Toast要强大,因为可以设定点击的监听事件),在按钮点击之后SnackBar出现之后按钮会自动的向上移动避免被遮挡,这是CoordinatorLayout的一个功能. Android Design Support Lib

【Android 系统开发】 编译 Android 系统 u-boot 内核 源码 并烧写到 OK-6410A 开发板上

博客地址 : http://blog.csdn.net/shulianghan/article/details/40299813  本篇文章中用到的工具源码下载 : -- ok-6410A 附带的 Android 光盘 下载地址 : http://pan.baidu.com/share/link?shareid=3662728609&uk=2754759285 ; -- 光盘所含内容 : Android 引导 u-boot 源码, Android 内核 源码, Android 系统源码, 交叉编

Android 通过JNI实现守护进程,使得Service服务不被杀死

来自: http://finalshares.com/read-7306 转载请注明出处: http://blog.csdn.net/yyh352091626/article/details/50542554 开发一个需要常住后台的App其实是一件非常头疼的事情,不仅要应对国内各大厂商的ROM,还需要应对各类的安全管家...虽然不断的研究各式各样的方法,但是效果并不好,比如任务管理器把App干掉,服务就起不来了... 网上搜寻一番后,主要的方法有以下几种方法,但都是治标不治本: 1.提高Serv

android源码解析之(十一)--&gt;应用进程启动流程

在android guide中有这样的一段关于android应用程序进程的描述: By default, every application runs in its own Linux process. Android starts the process when any of the application's components need to be executed, then shuts down the process when it's no longer needed or w

Android 面试题总结之Android 进阶(二)

Android 之美 从0到1 之Android 进阶(二) 在上一章节中<Android 之美 从0到1 之Android 进阶(一)>中我们已经理解了一些View的基本知识并且知道如何自定义View.那么本章节将继续深入理解View,关于View的绘制流程,View的事件分发.刷新机制等等. 在阅读过程中有任何问题,请及时联系.如需转载请注明 fuchenxuan blog 本章系<Android 之美 从0到1 – 高手之路>Android 深入理解View的绘制流程. An