美文网首页
Activity-通讯

Activity-通讯

作者: lvcs | 来源:发表于2019-08-23 14:32 被阅读0次

1.Client >AMS

APP 向 ActivityManagerService(简称AMS)发起进程间通信,是通过IActivityManager接口。

//Instrumentation
public ActivityResult execStartActivity( Context who, IBinder contextThread, IBinder token, Activity target,
            Intent intent, int requestCode, Bundle options) {
 ......   
       //发起通信
       int result = ActivityManager.getService()
            .startActivity(whoThread, who.getBasePackageName(), intent,
                   intent.resolveTypeIfNeeded(who.getContentResolver()),
                   token, target != null ? target.mEmbeddedID : null,
                   requestCode, 0, null, options);
 ......
        return null;
    }
//ActivityManager
public static IActivityManager getService() {
     return IActivityManagerSingleton.get();
}
 
private static final Singleton<IActivityManager> IActivityManagerSingleton =
            new Singleton<IActivityManager>() {
                @Override
             protected IActivityManager create() {
                  //得到代表AMS的IBinder接口
                  final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
                  //转成IActivityManager的接口
                  final IActivityManager am = IActivityManager.Stub.asInterface(b);
                  return am;
             }
};
//ServiceManager
//缓存系统服务
private static HashMap<String, IBinder> sCache = new HashMap<String, IBinder>();
public static IBinder getService(String name) {
       try {
           IBinder service = sCache.get(name);
           if (service != null) {
              return service;
            } else {
               return Binder.allowBlocking(rawGetService(name));
            }
        } catch (RemoteException e) {
            Log.e(TAG, "error in getService", e);
        }
        return null;
}

最后由ActivityManagerService 处理相关操作

public class ActivityManagerService extends IActivityManager.Stub
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {......}

通过ServiceManager类的getService()函数,得到代表AMS的IBinder接口,也可传入其它服务名称,取得对应系统服务(具体看Context)

2.AMS > Activity

    //mService为ActivityManagerService   thread为本次ActivityThread
    mService.getLifecycleManager().scheduleTransaction(prev.app.thread, prev.appToken,
                        PauseActivityItem.obtain(prev.finishing, userLeaving,
                                prev.configChangeFlags, pauseImmediately));
                                
                                
    //ClientLifecycleManager
    void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
        final IApplicationThread client = transaction.getClient();
        transaction.schedule();
......
    }

    //ClientTransaction
    public void schedule() throws RemoteException {
        mClient.scheduleTransaction(this);
    }

ActivityThread的内部类ApplicationThread派生这个接口类并实现了对应的方法。所以直接跳转到ApplicationThread中的scheduleTransaction方法,通过Binder服务回到ActivityThread

//ActivityThread
private class ApplicationThread extends IApplicationThread.Stub {
......
        @Override
        public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
            //回到ActivityThread
            ActivityThread.this.scheduleTransaction(transaction);
        }
}

//ClientTransactionHandler  ActivityThread继承自ClientTransactionHandler
void scheduleTransaction(ClientTransaction transaction) {
        transaction.preExecute(this);
        //通过消息循环执行相关方法
        sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
}

相关文章

网友评论

      本文标题:Activity-通讯

      本文链接:https://www.haomeiwen.com/subject/cpozsctx.html