概述
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"所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复