Replugin插件化技术解读之插件四大组件调用原理-Service(二)

本文详细解析了Replugin框架中插件Service的启动过程,从PluginContext开始,通过PluginServiceClient.startService,再到PSS对象的生成,特别是针对不同进程的处理。文中提到,启动自定义进程Service时,会利用动态编译生成的Provider来启动新进程。文章最后提出了疑问,是否支持宿主应用直接启动插件内的Service,并邀请了解的读者留言讨论。
摘要由CSDN通过智能技术生成

在《Replugin插件化技术解读之插件四大组件调用原理-Activity(一)》中描述了Replugin插件框架中宿主app和插件app是如何如何启动插件Activity的大致流程,显然既然讲述了Activity,作为Android四大组件之一的Service当然也要说明下怎么玩的啦。看官继续往下看。^_^

一、开启插件内Service

第1步:在《Replugin插件化技术解读之框架初始化、插件安装与加载(二)》中我们知道插件在加载的时候会自动生成PluginContext来作为插件内上下文使用,而插件中startService其实调用的就是已经被重写的startService方法了。

PluginContext.java

public ComponentName startService(Intent service) {
        if (mContextInjector != null) {
            mContextInjector.startServiceBefore(service);
        }

        。。。
        try {
            return PluginServiceClient.startService(this, service, true);
        } catch (PluginClientHelper.ShouldCallSystem e) {
            // 若打开插件出错,则直接走系统逻辑
            return super.startService(service);
        } finally {
            if (mContextInjector != null) {
                mContextInjector.startServiceAfter(service);
            }
        }
    }

第2步: PluginServiceClient.startService中会首先获取ComponentName对象,得到插件包名和对应Service Class类型对象,然后获得开启的Service所属的进程号,如UI进程或者常驻进程。接着会通过进程号获得对应的IPluginServiceService pss对象,进行pss.startService操作。

public static ComponentName startService(Context context, Intent intent, boolean throwOnFail) {

        // 1. 从 Intent 中获取 ComponentName,包含想要开启的ServiceName以及插件包名
        ComponentName cn = getServiceComponentFromIntent(context, intent);

        // 2. 获取将要使用服务的进程ID,
        int process = getProcessByComponentName(cn);
        if (process == PROCESS_UNKNOWN) {
            // 有可能是不支持的插件,也有可能本意就是想调用Main工程的服务。则直接调用系统方法来做
            if (LOG) {
                LogDebug.d(PLUGIN_TAG, "PSS.startService(): Call SystemAPI: in=" + intent);
            }
            if (throwOnFail) {
                throw new PluginClientHelper.ShouldCallSystem();
            } else {
                return context.startService(intent);
            }
        }

        // 既然确认是插件,则将之前获取的插件信息填入
        intent.setCompo
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值