我是靠谱客的博主 魔幻苗条,最近开发中收集的这篇文章主要介绍Android5.0 startService时崩溃 错误"Service Intent must be explicit",觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Android 5.0之前启动Service有两种方式: 显示和隐式.
Android5.0有个新特性”Service Intent must be explitict”,
也就是说只能实用显示方式启动Service, 所以实用隐式方式启动
Service时会crash, 我们可以看看源码, startService方法到底干了
什么:

方法调用: startService()->startServiceCommon()->validateServiceIntent()

validateServiceIntent()方法的源码如下:

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

源码在:android/app/ContextImpl.java中

根据源码,可以给Intent设置一个package就可以决绝上述的crash, 如:

Intent intent = new Intent("com.xxx.yyyy.action");
intent.setPackage(getPackageName());
startService(intent);

根据源码还有就是”service.getComponent() == null”不为空,
其实显式启动Service时component就不为null, 我们先看看显式启动Service是怎么干的:

Intent intent = new Intent(this, DemoService.class);
startService(intent);

Intent(Context ctx, Class clazz)这个构造方法到底干了什么

public Intent(Context packageContext, Class<?> cls) {
mComponent = new ComponentName(packageContext, cls);
}

其实也是把构造方法的参数变成了ComponentName, 下面是把隐式Intent转化为显式Intent的方法
(实际上就是构造出一个ComponentName对象是用Intent的setComponent设置一下):

public static Intent convertToExplicitIntent(Context context, Intent intent) {
PackageManager pm = context.getPackageManager();
List<ResolveInfo> resolveInfo = pm.queryIntentServices(intent, 0);
if (resolveInfo == null || resolveInfo.size() != 1) {
return null;
}
ResolveInfo serviceInfo = resolveInfo.get(0);
String packageName = serviceInfo.serviceInfo.packageName;
String className = serviceInfo.serviceInfo.name;
ComponentName component = new ComponentName(packageName, className);
Intent explicitIntent = new Intent(intent);
explicitIntent.setComponent(component);
return explicitIntent;
}

最后

以上就是魔幻苗条为你收集整理的Android5.0 startService时崩溃 错误"Service Intent must be explicit"的全部内容,希望文章能够帮你解决Android5.0 startService时崩溃 错误"Service Intent must be explicit"所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部