1. 程式人生 > 其它 >Activity啟動流程

Activity啟動流程

Activity啟動流程

ActivityThread

  1. 一個應用對應一個ActivityThread,當Zygote程序孵化出一個新的應用程序後,會執行ActivityThread的main函式,main中主要做了Looper訊息佇列的處理,然後呼叫了ActivityThread的attach()函式,將其繫結到ActivityManagerService中,開始不斷的讀取訊息佇列中的訊息並分發訊息,是典型的基於事件驅動的模型

    public final class ActivityThread extends ClientTransactionHandler{
        
        public static void main(String[] args){
    
            Looper.prepareMainLooper();
            ...
            ActivityThread thread = new ActivityThread();
            thread.attach(false, startSeq);
            ...
            Looper.loop;
        }
    }
    
  2. activityThread.attach()函式中主任務是將ApplicationThread繫結到ActivityManagerService中

    private void attach(boolean system, long startSeq){
    	if(!system){
            final IActivityManager mgr = ActivityManager.getService();
            try{
                //繫結applicationThread和activityMangerService
                mgr.attachApplication(mAppThread,startSeq);
            }
        }
        //ConfigChanged事件回撥處理
        ViewRootImpl.ConfigChangedCallBack configChangedCallback = (Configration globalConfig)->{
            if(mResourcesManger.applyConfigurationToResourcesLocked(globalConfig,null)){
                updateLocaleListFromAppContext(mInitialApplication.getApplicationContext(),mResourceManager.getConfiguration().getLocales());
                sendMessage(H.CONFIGURATION_CHANGED,globalConfig);
            }
        }
    }
    
  3. ActivityManagerService中attachApplication主要負責處理Application相關的邏輯,attachApplicationLocked主要處理activity啟動,通過層層呼叫最終在RootWindowContainer中呼叫activityStackSupervisor.realStartActivityLocked()開啟activity的生命週期

    public class class ActivityManagerService extends IActivityManger.Stub implements Watchdog.Monitor,BetteryStatsImpl.BatteryCallback{
    
        public final void attachApplication(IApplicationThread thread, loog startSeq){
            synchronized(this){
                int callingPid = Binder.getCallingPid();
                final int callingUid = Binder.getCallingUid();
                final int origId = Binder.clearCallingIdentity();
                attachApplicationLocked(thread,callingPid,callingUid,startSeq);
            }
        }
        private boolean attachApplicationLocked(IApplicationThread thread, int pid, int callingUid,long startSeq){
            ...
            //通過ApplicationThread向
            thread.bindApplication(...);
            ...
            //mAtmInternal為ActivityTaskManagerInternal物件,通過LocalServices.getService(class)獲取其實現類是
            //ActivityTaskManagerService的內部類LocalService
            mAtmInteranl.attachApplication(app.getWindowProcessController());
            //ActivityServicesq處理Services邏輯
            mServices.attachApplicationLocked(app,processName);
            //BroadCast
         sendPendingBroadcastsLocked(app);
        }
    }
    public class ActivityTaskManagerService extends IActivityManger.Sub{
        public ActivityTaskManagerService(Context context){
            mInternal = new LocalService();
        }
    	private void start(){
            LocalServices.addService(ActivityTaskManagerInternal.class,mInternal);
        }
    	final class LocalService extends ActivityTaskManagerInternal{
        }
    }
    public class ActivityStackSupervisor implements RecentTasks.Callbacks{
        boolean realStartActivityLocked(ActivityRecord r,WindowProcessController proc,boolean addResume, boolean checkConfig) throw RemoteException{
            ...
            final ClientTransaction clientTransaction = ClientTransaction.obatin(proc.getThread(),r.appToken);
            clientTransaction.addCallback(LaunchActivityItem.obatin(new Intent(r.intent),...));
            final ActivityLifecycleItem lifecycleItem;
            if(addResume){
                lifecycleItem = ResumeActivityItem.obatin(dc.isNextTransitionForward());
            }else{
                lifecycleItem = PauseActivityItem.obatin();
            }
            clientTransaction.setLifecycleStateRequest(lifecycleItem);
            //schedule transaction
            mService.getLifecycleManager().scheduleTransaction(clientTransaction);
        }
    }
    
  4. Activity生命週期處理,每個應用啟動後會在主執行緒中(ActivityThread.main)呼叫Looper.prepareMainLooper()獲取單例sMainLooper以及內部的訊息佇列,並將訊息佇列的quitAllowed屬性設定成false,經過複雜的啟動邏輯後最終呼叫Looper.looper()等待訊息的到來,LifecycleManger就是通過呼叫各種生命週期類向主執行緒發生message通知主執行緒(activityThread)處理生命週期函式,例如LuanchActivityItem、ResumeActivityItem、DestroyActivityItem等,其呼叫是通過持有ApplicationThread物件的ClientTransaction物件進行事件的傳遞,其中ApplicationThread是ActivityThread的內部類,可以直接呼叫activityThread的內部函式,**ActivityItem在原始碼的中的位置為frameworks\base\core\java\android\app\servertransaction

    class ClientLifecycleManager{
        void scheduleTransaction(ClientTransation transaction) throws RemoteException{
            final IApplicationThread client = transcation.getClient();
            transaction.schedule();
        }
    }
    public class ClitentTransaction implements Parcelable,ObjectPootItem{
        private List<ClitentTransactionItem> mActivityCallbacks;
        private ActivityLifecycleItem mLifecycleStateRequest;
        private IApplicationThread mClient;
        private IBinder mActivityToken;
        public void addCallback(ClitentTransactionItem activityCallback){
            mActivityCallbacks.add(activityCallback);
        }
        public void setLifecycleStateResuest(ActivityLifecycleItem stateRequest){
            mLifecycleStateRequest = stateRequest;
        }
        public void schedule() throws RemoteException{
            mClient.scheduleTransaction(this);
        }
        public void preExecute(ClientTransactionHandler clientTransactionHandler){
            if(mActivityCallbacks! = null){
                //在ActivityStackSupervisor中設定了LaunchActivityItem
               	final int size = mActivityCallbacks.size();
                for(int i = 0; i < size; i++){
            				mActivityCallbacks.get(i).preExecute(clientTransactionHandler,mActivityToenk);
                   //在ActivityStackSupervisor中設定了ResumeActivityItem或PauseActivityItem
                    mLifecycleStateRequest.preExecute(clientTransactionHandler,mActivityToken);
                }
            }
        }
    }
    private class ApplicationThread extends IApplicationThread.Stub{
        public void scheduleTransaction(ClientTransaction transaction) throws RemoteException{
            ActivityThread.this.scheduleTransaction(transaction);
        }
    }
    

    ​ ActivityThread繼承了ClientTransactionHandler類,最後呼叫到其父類的scheduleTransaction(this)函式,最後通過發生message通知ActivityThread處理相關邏輯其程式碼如下

    public abstract class ClientTransactionHandler{
        void scheduleTransaction(ClientTransaction transaction){
            transaction.preExecute(this);
            sendMessage(ActivityThread.H.EXECUTE_TRANSACTION,transaction);
        }
        abstract void sendMessage(int what,Object obj);
    }
    public final class ActivityThread extends ClientTransactionHandler{
        final H mh = new H();
        private final TransactionExecutor mTransactionExecutor = new TransactionExecutor(this);
        void sendMessage(int what,Object objt){
            sendMessage(what,obj,0,0,false);
        }
        private void sendMessage(int what,Object obj,int arg1,int arg2,boolean async){
            Message msg = Message.obtain();
            msg.what = what;
            msg.obj = obj;
            msg.arg1 = arg1;
            msg.arg2 = arg2;
            if(async){
                msg.setAsynchronous(true);
            }
            mH.sendMessage(msg);
        }
    	class H extends Handler{
            public void handleMessage(Message msg){
                switch(mgs.what){
                    case BIND_APPLICATION:
                        AppBindData data = (AppBindData)msg.obj;
                        handleBindApplication(data);
                        break;
                    case EXECUTE_TRANASCTION:
                        final ClientTransaction transtion = (ClientTransaction)msg.obj;
                        mTransactionExecutor.execute(transtion);
                        break;
                }
            }//end handleMessage
        }//end H
    }//end ActivityThread
    
    public class TransactionExecutor{
        public void execute(ClientTransaction transaction){
            ...
            executeCallbacks(transaction);
            executeLifecycleState(transaction);
        }
        public void executeCallbacks(ClientTransaction transaction){
            ...
            final List<ClientTransactionItem> callbacks = transaction.getCallbacks();
            final int size = callbacks.size();
            for(int i =0; i < size; i++){
                final ClientTransactionItem item = callbacks.get(i);
                item.execute(mTransactionHandler,token,mPendingActions);
                item.postExecute(mTransctionHandler,token,mPendingAcitions);
            }
            ...
        }
    }//end TransactionExecutor
    
    public class LaunchActivityItem extends ClientTransactionItem{
        public void execute(ClientTransactionHandler client,IBinder token,PendingTransactionAction pendingActions){
            // client實現類為ActivityThread,所有的回撥完成,最終程式碼邏輯交由主執行緒ActivityTrhead控制
            client.handleLaunchActivity(r,pengdingAction,null);
        }
    }//end LaunchActivityItem
    
    public class ResumeActivityTime extends ClientTransactionItem{
        public void execute(ClientTransaction client,IBinder token, PendingTransactionActions pendingActions){
            client.handleResumeActivity(token,true,mIsForward,"RESUME_ACTIVITY");
        }
    }
    
  5. 前面所有的邏輯處理完回到了ActivityThread物件的handleLaunchActivity中,最終在preformLaunchActivity中通過反射newInstance()建立activity物件和application物件,並建立appContext物件,呼叫activity.attach()繫結到activity中,然後就根據需要開始呼叫activity的生命週期函式

    public Activity handleLaunchActivity(ActivityClientRecord r, PendingTransactions pendingActions, Intent customIntent){
        final Activity a = preformLaunchActivity(r,customIntent);
    }
    private Activity perfromLaunchActivity(ActivityClientRecord r,Intent customIntent){
        ...
        ContextImpl appContext = createBaseContextForActivity(r);
        Activity activity = null;
        try{
            java.lang.ClassLoader cl = appContext.getClassLoader();
            activity = mInstrumentation.newActivity(cl,component.getClassName(),r.intent);
            ...
        }catch(Exception e){
            ...
        }
        //建立完app後執行instrumentation.callApplicationOnCreate(app);執行生命週期函式
        Application app = r.packageInfo.makeApplication(false,mInstrumentation);
        ...
        activity.attach(appContext,this,...);
        //後續計算生命週期會用到
        r.setState(ON_CREATE);
        ...
        mInstrumentation.callActivityOnCreate(activity,r.state);
    }
    public class Instrumentation{
        public void callActivityOnCreate(Activity activity, Bundle icicle){
            prePreformCreate(activity);
            //執行activity的onCreate()函式
            activity.performCreate(icicle);
            postPerformCreate(activity);
        }
    }
    
  6. 生命週期的執行與計算,transactionExecutor執行execute()函式會先執行callback回撥(LaunchActivityItem),然後在執行生命週期函式,分別為executeCallbacks(transaction)和executeLifecycleState(transaction),執行生命週期會先進行計算生命週期的順序,自動新增需要執行的生命週期狀態,先處理完自動新增的生命週期函式,然後在執行主動呼叫的生命週期函式,關鍵程式碼如下

    public abstract class ActivityLifecycleItem extends ClientTransactionItem{
        @InfDef(prefix = {"UNDEFINED","PRE_","ON_"},value={
            UNDEFINED,
            PRE_ON_CREATE,
            ON_CREATE,
            ON_STATR,
            ON_RESUME,
            ON_PAUSE,
            ON_STOP,
            ON_DESTROY,
            ON_RESTART
        })
        public static final int UNDEFINED = -1;
        public static final int PRE_ON_CREATE =0;
        public static final int ON_CREATE =1;
        public static final int ON_START = 2;
        public static final int ON_RESUME = 3;
        public static final int ON_PAUSE = 4;
        public static final int ON_STOP = 5;
        public static final int ON_DESTORY = 6;
        public static final int ON_RESTART = 7;
        //每個執行後對應的生命週期狀態,如果沒有則返回UNDEFINED,如LaunchActivityItme沒有對應的
        //生命週期返回UNDEFINED
        public abstract int getTargetState();
    }//end ActivityLifecycleItem
    public class TransactionExecutor{
        public void execute(ClientTransaction transaction){
            ...
            executeCallback(transaction);
            executeLifecycleState(transaction);
        }
        private void executeLifecyleState(ClientTransaction transaction){
            //獲取到ActivityStackSupervisor設定的ResumeActivityItem
            final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleState();
            ...
            //targeState 返回 ON_RESUME = 3
            cycleToPath(r,lifceycleItem.getTargeState(),true,transaction);
            lifecycleItem.execute(...);
            lifecycleItem.postExecute(...);
        }
    	private void cycleToPath(ActivityClientRecord r, int finsh,boolean excludeLastState,ClientTransaction transaction){
            //執行LaunchActivityItem呼叫activityThread.performLaunchActivity()中設定成了ON_CREATE =1
            final int start = r.getLifecycleState();
            //自動新增start->finish狀態中缺少的生命週期狀態
            final IntArray path = mHelper.getLifecyclePath(start,finish,excludeLastState);
            //執行新增到path中的生命週期狀態
            performLifecycleSequence(r,path,transaction);
        }
        private void performLifecycelSequence(ActivityClientRecord r, IntArray path, ClientTransaction transaction){
            final int size = path.size();
            for(int i = 0,state;i < size ; i++){
                state = path.get(i);
                switch(state){
                    case ON_CREATE:
                        mTranscationHandler.handleLaunchActivity(r,mPendingActions,null);
                        break;
                    case ON_START:
                        mTranscationHandler.handleStartActivity(r.token,mPengdingActions);
                        break;
                    case ON_RESUME:
                        mTransactionHandler.handleResumeActivity(r.token,false,r.isForward,"LIFECYCLER_RESUME_ACTIVITY")
                            break;
                        ....
                }
            }
        }
    }//end TransactionExecutor
    

    mTransactionHandler是ActivityThread物件,實際執行的生命週期函式都是在ActivityThread的主執行緒中呼叫的,每個生命週期都在ActivityThread類中有對應的handle***Activity函式,從ON_CREATE->ON_RESUME生命週期中會自動新增ON_START生命週期狀態,然後根據追加的IntArry中遍歷取出自動增加的狀態並呼叫ActivityThread中對應的生命週期函式,自動新增ON_START狀態程式碼如下

    public class TransactionExecutorHelper{
        private IntArray mLifecycleSequence = new IntArray(6);
        public IntArray getLifecyclePath(int start,int finish,boolean excludeLastState){
            ...
            mLifecycleSequence.clear();
            //start=ON_CREATE=1,finish=ON_RESUME=3
            if(finish >= start){
                if(start==ON_START && finish==ON_STOP){
                    mLifecycleSequence.add(ON_STOP);
                }else{
                    //初始值為2,finish為3,所以會自動新增2和3的狀態,也就是ON_START和ON_RESUME
                    for(int i = start+1;i<=finish;i++){
                        mLifecycleSequence.add(i);
                    }
                }//end if
            }//end if
             ...
             if(excludeLaste && mLifecycleSequence.size() != 0){
                 //刪除多餘的ON_RESUME,保留缺少的ON_START
             	mLifecycleSequence.remove(mLifecycleSequence.size()-1);
             }
            return mLifecycleSequence;
        }
    }