Android5.0隐式启动服务

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

你可能感兴趣的:(android)