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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值