解读IApplicationThread是干什么用的?

456 阅读1分钟

IApplicationThread.aidlAndroid实现用来跨进程通信的接口.他的实现类是ApplicationThread,他也是ActivityThread的内部类.

ApplicationThread是Android系统中的重要组件, 他用来实现应用程序进程和系统服务之间的通信. 为什么说他实现的是应用程序进程和系统服务之间的通信呢? 因为随着ActivityThred进程的创建,都会创建对应的ApplicationThread,

class ActivityThread{
    final ApplicationThread mAppThread = new ApplicationThread();
    
    class ApplicationThread extends IApplicationThread.Stub{
        ---
        ---
    }
}

他的职责主要用来管理Activity的生命周期,发送广播等操作,现在分析下他是怎么实现的生命周期的管理:

ActivityTaskManagerService会调用ClientLifecycleManagerscheduleTransaction(ClientTransaction transaction)方法:

class ClientLifecycleManager{
    void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
        final IApplicationThread client = transaction.getClient();
        transaction.schedule();
        if (!(client instanceof Binder)) {
            transaction.recycle();
        }
    }
}

这里可以看到会传入对象ClientTransaction,ClientTransaction有一个叫ActivityLifecycleItem mLifecycleStateRequest的成员变量,他保存的就是当前Activity所处的生命周期阶段. 截图 2023-04-12 15-03-22.png.
继续看到调用ClientTransaction.schedule():

class ClientTransaction{
    private IApplicationThread mClient;
    publish void schedule(){
    //可以看到在这里进行跨进程通信
        mClient.scheduleTransaction(this);
    }
}

然后就来到了ApplicationThread scheduleTransaction(ClientTransaction transaction)

class ApplicationThread{
    public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
        ActivityThread.this.scheduleTransaction(transaction);
    }
}

class ActivityThread{
    void scheduleTransaction(ClientTransaction transaction) {
        transaction.preExecute(this);
        sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
    }
}

可以看到这一套流程走下来,就实现了ActivityTaskManagerServiceActivityThread两个进程间的通信了.