【安卓四大组件】startService启动流程(未)

【安卓四大组件】startService流程(未)

1:进程A(发起调用端)

方法调用过程:
MyActivity.startService() -> ContentWrapper#startService -> ContentImpl#startService -> ContentImpl#startServiceCommon
看startServiceCommon()方法源码:

private ComponentName startServiceCommon(Intent service, boolean requireForeground,
UserHandle user) {
			... ...
            ComponentName cn = ActivityManager.getService().startService(
                mMainThread.getApplicationThread(), service, service.resolveTypeIfNeeded(
                            getContentResolver()), requireForeground,
                            getOpPackageName(), user.getIdentifier());  
            return cn;
    }

实际上ActivityManager.getService()内部只有一行代码:

return IActivityManagerSingleton.get();

其中, IActivityManagerSingletonAvtivityManager类中的一个私有静态成员, 在类加载时加载到内存, 其内部进行了一次IActivityManager的创建. 然后通过get()方法获取IActivityManager实例.

private static final Singleton<IActivityManager> IActivityManagerSingleton =
           new Singleton<IActivityManager>() {
               @Override
               protected IActivityManager create() {
                   final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
                   final IActivityManager am = IActivityManager.Stub.asInterface(b);
                   return am; } };

所以在startServiceCommon()方法中的ActivityManager.getService().startService()实际上就是IActivityManager.startService().
也就是说,这整个过程可以简化为``"进程A调用startService方法,本质上是通过binder通信,调用IActivityManager#startService方法.

2:system_server端

SystemServer进程的binder线程响应此请求,ActivityManagerService#startService方法被调用.

方法调用过程:
ActivityManagerService#startActivity -> ActivityService#startServiceLocked ->ActivityService#startServiceInnerLocked -> ActivityService#bringUpServiceLocked

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值