Activity类中mDecor变量何时被赋值的?

这是Android绘制原理的相关知识点。文章《DecorView如何添加到Fragmentwork层的》中提到有一个方法makeVisible()用用到了mDecor,但是并没有提该变量何时被赋值的,今天我们就来说说变量mDecor赋值时机。

Activity类中的变量nDecor定义。

//androidx.app                                        
public class Activity {

	View mDecor = null;
	
}

何时被赋值的呢?

快捷键查找被调用的地方,如下图所示。

并么有查找到被赋值的调用方法。那么我们就看看ActivityThread类中有没有赋值的地方。

 ActivityThread类handleResumeActivity()方法对mDecor进行的赋值。我们继续一层一层看,该方法如何被调用的。


public final class ActivityThread extends ClientTransactionHandler {


    //该方法中对Activity类中变量mDecor进行了赋值,该方法是被类TransactionExecutor调用
    @Override
    public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward,
            String reason) {
		
		final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason);

    	final Activity a = r.activity;

    	View decor = r.window.getDecorView();
        //看这里,看这里,看这里,在这里对Activity中mDecor变量赋值的
    	a.mDecor = decor;

    }
   
    
}


//TransactionExecutor,通过该类中的一连串方法调用,最终调用以上handleResumeActivity()
public class TransactionExecutor {
    
    //执行生命周期序列方法
    private void performLifecycleSequence(ActivityClientRecord r, IntArray path,
            ClientTransaction transaction) {
        //第一次调用
        mTransactionHandler.handleResumeActivity(r.token, false,
                            r.isForward, "LIFECYCLER_RESUME_ACTIVITY");
    }
    
    //循环到路径方法
    private void cycleToPath(ActivityClientRecord r, int finish, boolean excludeLastState,
            ClientTransaction transaction) {
         //第二次调用
        performLifecycleSequence(r, path, transaction);
    }
    
    //执行生命周期状态方法
    private void executeLifecycleState(ClientTransaction transaction) {
        //第三次调用
        cycleToPath(r, lifecycleItem.getTargetState(), true , transaction);
    
    }
    
    //执行方法
    public void execute(ClientTransaction transaction) {
        //第四次调用
        executeLifecycleState(transaction);
    }
    
    
    
}


//通过向主线程Handler发送消息调用上面的execute()方法
public final class ActivityThread extends ClientTransactionHandler {
 //主线程的Handler
    H mH = new H();
    
    //通过Handler的handMessage()
    private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) {
        mH.sendMessage(msg);
    }

    //内部类H
    class H extends Handler {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case EXECUTE_TRANSACTION:
                    final ClientTransaction transaction = (ClientTransaction) msg.obj;
                    //从这里开始一步步的调用,最终回调handleResumeActivity()方法
                    mTransactionExecutor.execute(transaction);
                }
                break;
            }
        }
    }

    private final TransactionExecutor mTransactionExecutor = new TransactionExecutor(this);
    
}

//ActivityThread
public final class ActivityThread extends ClientTransactionHandler {
    
    //通过该方法向主线程Handler发送消息,最终调用execute()方法
    void scheduleTransaction(ClientTransaction transaction) {
        transaction.preExecute(this);
        sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
    }

}

//ActivityThread::ApplicationThread内部类
private class ApplicationThread extends IApplicationThread.Stub {
        //调度事务方法
        @Override
        public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
            ActivityThread.this.scheduleTransaction(transaction);
        }
}

//ClientTransaction
public class ClientTransaction implements Parcelable, ObjectPoolItem {

    private IApplicationThread mClient;

    //调度方法
    public void schedule() throws RemoteException {
        mClient.scheduleTransaction(this);
    }
}

//com.android.server.wm
//ClientLifecycleManager
class ClientLifecycleManager {

    void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
        final IApplicationThread client = transaction.getClient();
        transaction.schedule();

    }

}


//com.android.server.wm
//ActivityStackSupervisor,
public class ActivityStackSupervisor implements RecentTasks.Callbacks {

    final ActivityTaskManagerService mService;
    
    boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,
            boolean andResume, boolean checkConfig) throws RemoteException {
        mService.getLifecycleManager().scheduleTransaction(clientTransaction);
    }

}

//com.android.server.wm
//ActivityTaskManagerService
public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
    
    private final ClientLifecycleManager mLifecycleManager;

    ClientLifecycleManager getLifecycleManager() {
        return mLifecycleManager;
    }


}

第一步:TransactionExecutor类中方法调用的,一步步的追踪到execute()方法。继续查看execute()由谁来调用的。

public class TransactionExecutor {
    
    //执行生命周期序列方法
    private void performLifecycleSequence(ActivityClientRecord r, IntArray path,
            ClientTransaction transaction) {
        mTransactionHandler.handleResumeActivity(r.token, false,
                            r.isForward, "LIFECYCLER_RESUME_ACTIVITY");
    }
    
    //循环到路径方法
    private void cycleToPath(ActivityClientRecord r, int finish, boolean excludeLastState,
            ClientTransaction transaction) {
        performLifecycleSequence(r, path, transaction);
    }
    
    //执行生命周期状态方法
    private void executeLifecycleState(ClientTransaction transaction) {
        cycleToPath(r, lifecycleItem.getTargetState(), true , transaction);
    
    }
    
    //执行方法
    public void execute(ClientTransaction transaction) {

        executeLifecycleState(transaction);
    }
    
    
    
}

//ActivityThread::ApplicationThread
private class ApplicationThread extends IApplicationThread.Stub {
        //调度事务方法
        @Override
        public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
            ActivityThread.this.scheduleTransaction(transaction);
        }
}

//ClientTransaction
public class ClientTransaction implements Parcelable, ObjectPoolItem {
    //调度方法
    public void schedule() throws RemoteException {
        mClient.scheduleTransaction(this);
    }
}

//ClientLifecycleManager
class ClientLifecycleManager {
    //调度事务
    void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
        final IApplicationThread client = transaction.getClient();
        transaction.schedule();

    }

}

第二步:ActivityThread类的内部类H调用的。继续追踪查看由谁来发送消息到主线的Handler中。


public final class ActivityThread extends ClientTransactionHandler {

    //主线程的Handler
    H mH = new H();
    
    //通过Handler的handMessage()
    private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) {
        mH.sendMessage(msg);
    }

    //内部类H
    class H extends Handler {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case EXECUTE_TRANSACTION:
                    final ClientTransaction transaction = (ClientTransaction) msg.obj;
                    //
                    mTransactionExecutor.execute(transaction);
                }
                break;
            }
        }
    }
    private final TransactionExecutor mTransactionExecutor = new TransactionExecutor(this);

}

 第三步:ActivitThread类的内部类ApplicationThread方法scheduleTransaction()调用了sendMessage()方法。继续追踪scheduleTransaction()方法由谁来调用的。

private class ApplicationThread extends IApplicationThread.Stub {
        //调度事务方法
        @Override
        public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
            ActivityThread.this.scheduleTransaction(transaction);
        }
}

第四步:ClientThrasaction类的schedule() 调用了scheduleTransaction()方法。

public class ClientTransaction implements Parcelable, ObjectPoolItem {
    //调度方法
    public void schedule() throws RemoteException {
        mClient.scheduleTransaction(this);
    }
}

 第五步:ClientLifecycleManager类的scheduleTransaction()调用。继续追踪scheduleTransaction()方法由谁调用。

class ClientLifecycleManager {
    //调度事务
    void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
        final IApplicationThread client = transaction.getClient();
        transaction.schedule();

    }

}

第六步:ActivityStackSupervisor 类的realStartActivityLocked()方法调用。

//com.android.server.wm
//ActivityStackSupervisor
public class ActivityStackSupervisor implements RecentTasks.Callbacks {

    final ActivityTaskManagerService mService;
    
    boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,
            boolean andResume, boolean checkConfig) throws RemoteException {
        mService.getLifecycleManager().scheduleTransaction(clientTransaction);
    }

}

//com.android.server.wm
//ActivityTaskManagerService
public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
    
    private final ClientLifecycleManager mLifecycleManager;

    ClientLifecycleManager getLifecycleManager() {
        return mLifecycleManager;
    }


}

//com.android.server.wm
//ClientLifecycleManager
class ClientLifecycleManager {

    void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
        final IApplicationThread client = transaction.getClient();
        transaction.schedule();

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值