android v7透明activity,Android之Activity盖上一个透明主题Activity

本文介绍了如何在Android中,当一个透明主题的Activity(ActivityB)覆盖在另一个Activity(ActivityA)上时,如何将点击事件从ActivityB传递给ActivityA,而无需额外的接口或库。通过分析Activity的创建过程,特别是对WindowManagerGlobal的使用,展示了在onResume()中通过反射获取底层Activity的DecorView并转发触摸事件的实现方法。
摘要由CSDN通过智能技术生成

背景

给一个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) {

//----------------------------------

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值