Android5.0隐式启动服务

本文介绍了解决Android5.0中通过隐式意图启动Service的问题,提供了两种将隐式意图转换为显式意图的方法,确保跨应用启动Service的稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值