背景
给一个Activity A,盖上一个透明主题的ActivtiyB,在B中的点击事件怎么传递给A?同学面试问到了这个问题。
我们普通的思考方式都是接口啊,或者EventBus或者Livedata。
这样的方式都可以!但是稍显麻烦。有没有更简单,不需要增加额外类的方法?
简单方案
不需要额外引入类?意味着只能使用Activity B中的内容,这时候我们就需要去思考Activity创建过程了。
首先我们都知道一个Activity启动之后,会执行onCreate 和onResmume()。
我们来从源码的角度来看看这里做了些啥。(源码并不多,多看看就了解了)
Activity的创建
如果是App的主Activity,它肯定是launch程序通过startActivty开始的,到AMS进程中去解析需要启动的Activity信息,然后判断需要启动的应用进程是否创建,如果没有创建会通过socket的方式去和Zygote进程建立连接,然后进入Zygote中,它会forke一个子进程,在子进程中反射调用ActivtiyThread的main方法,在main方法里面我们会创建Looper 以及一个mH的handler,mH它能帮我们完成许多事情,比如帮我们创建Application的回调,以及Activity这种组件的生命周期的回调,到此一个应用程序的进程就创建成功了!接下来就是执行关于oncreate的内容了。
//----------------------------ActivityThread.java---------------------------
@Override
public Activity handleLaunchActivity(ActivityClientRecord r,
PendingTransactionActions pendingActions, Intent customIntent) {
//................................
// Hint the GraphicsEnvironment that an activity is launching on the process.
GraphicsEnvironment.hintActivityLaunch();
final Activity a = performLaunchActivity(r, customIntent);
//................................
return a;
}
private Activity performLaunchActivity(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);
StrictMode.incrementExpectedActivityCount(activity.getClass());
r.intent.setExtrasClassLoader(cl);
r.intent.prepareToEnterProcess();
if (r.state != null) {
r.state.setClassLoader(cl);
}
} catch (Exception e) {
//----------------------------------
}