在Android 5.0中系统禁止我们通过隐式意图启动service,如果通过隐式意图启动会报异常,所以需要通过显式意图启动service,如果要被启动的服务在本应用中,还可以通过显式意图启动,但是如果是要启动其他应用的service,那么如何通过显式意图来启动呢?
在Android5.0之前的手机安装涉及到隐式意图启动的服务,不会产生问题,5.0之后目前主流的手机上产生的问题。
隐式意图会报异常,app崩溃,解决其他应用启动不在本应用内的service怎样通过显式意图启动
只需要将一个隐式意图转换成显式意图:
第一种方式: 设置compontent组件。
public class ExplicitIntentUtil {
public static Intent getExplicitIntent(Context context, Intent implicitIntent) {
PackageManager pm = context.getPackageManager(); // 得到包管理器。
// 返回給定条件下的ResolveInfo对象,本质上是service.
List<ResolveInfo> info = pm.queryIntentServices(implicitIntent, 0);
// 这个地方意图对象一次只能进来一个。
if (info == null || info.size() != 1) {
return null;
}
// 所得到的对象就是ServiceInfo.
ResolveInfo resolveInfo = info.get(0);
String packageName = resolveInfo.serviceInfo.packageName;
String className = resolveInfo.serviceInfo.name;
//通过Service的包名,和类名创建Component组件。
ComponentName componentName = new ComponentName(packageName, className);
Intent explicitIntent = new Intent(implicitIntent);
explicitIntent.setComponent(componentName);
return explicitIntent;
}
}
Intent bindIntent = new Intent("com.example.servicedemo.DemoAIDL");
Intent explicitIntent = ExplicitIntentUtil.getExplicitIntent(MainActivity.this, bindIntent);
bindService(bindIntent, conn, BIND_AUTO_CREATE);
第二种方式:
假如知道Service服务的包名的话时:
Intent bindIntent = new Intent("com.example.servicedemo.DemoAIDL");
bindIntent.setPackage("com.example.servicedemo");
bindService(bindIntent, conn, BIND_AUTO_CREATE);