
前言
先出一个题吧,Activity A 跳转Activity B,再从Activity B按back键回退,两个过程各自的生命周期?
这是一个比较简单的生命周期问题,但是很多人会答错。那我们就对整个生命周期进行一个分析,再给出答案好了。并且文章内有一些内容我已经写过了,都是通过给出链接方式跳转查看了,请见谅。
目录
- Android必知必会的四大组件 -- Activity篇
- Android必知必会的四大组件 -- ContentProvider篇
- Android必知必会的四大组件 -- Broadcast Receiver篇
- Android必知必会的四大组件 -- Service篇
思维导图

生命周期

这儿重点要知道的是下面这两对各自之间的区别的区别。
(1)onPause()
和onStop()
(2)onStart()
和onResume()
onPause()
说明当前的Activity
已经暂停,但你并不是说暂停的意思只是没有了动作,而调用了onStop()
才让Acivity
不可见。onStart()
也是一样,只是说Activity
已经可以启动了,但这个时候页面还是不可见的,只有调用了onResume()
页面才能够可见,页面跳转也是如此。
现在在回答一下之前的问题,Activity A 跳转Activity B,再从Activity B按back键回退,两个过程各自的生命周期?
- Activity A 跳转Activity B: Apause -> Bcreate -> Bstart -> Bresume -> Astop
- Activity B再按back键回退: Bpause -> Arestart -> Astart -> Aresume -> Bstop -> Bdestroy
启动模式
事件分发机制
这里说一下为什么我要把这个模块放在Activity
,明明这个机制涉及的有三方Activity
、ViewGroup
、View
。
其实我的思考主要是因为Activity
是接受到这些动作的第一人,而不管是ViewGroup
还是View
,都是后来经过一个事件的分发后,才有的他们的处理,所以我将事件分发机制归结于此。
Activity之间的数据传输
在Activity
的跳转之间,其实存在很多需要带上数据的情况。举个例子来说,就像是从Activity A
一个新闻列表中选取了一条新闻,那这个时候就需要跳转进入Activity B
,而查询新闻的方式我们就假设是他的id
那这个时候,就需要将这个id
从Activity A
送到Activity B
中。
其实这种方式有很多,但是最普遍进行使用的莫过于putExtra(key, value)
了。
使用方法
// 1. 定义跳转页面
Intent intent = new Intent(this, SecActivity.class);
// 2. 将数据放到Intent中
intent.putExtra("parameter key", "parameter value");
// 3. 启动页面
// |-- 不带回传方法
startActivity(intent);
// |-- 带回传方法
startActivityForResult(intent, REQUEST_CODE);
这里要注意的一个问题就是,如果想要接受到返回的数据,那我们就存在必须重写的方法,通过下方模版即可完成。
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if(requestCode == REQUEST_CODE){
// 进行相应的处理
}
super.onActivityResult(requestCode, resultCode, data);
}
完成了页面跳转和参数传递,那我们接下来要干啥?当然是拿到这些参数了!!!
getIntent().getStringExtra(key);
getIntent().getBooleanExtra(key);
// 。。。。。。
实在太多了,我就不一一列举了。那我们就出现问题了getIntent()
哪儿来的,传递靠的是什么机制??,因为我们的接收还没讲完,所以我们这个问题先保留。
因为我们说过一个事情存在回调,我们应该要怎么做的问题。
// 通过setRsult()方法,来进行一个数据的回传
setResult(resultCode);
setResult(resultCode, intent);
// 模版,setResult()方法二选一
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 说明是一个返回事件
if (keyCode == KeyEvent.ACTION_DOWN && event.getAction() == KeyEvent.ACTION_DOWN) {
Intent intent = new Intent();
intent.putExtra("parameter key", "parameter value");
// setResult(resultCode);
setResult(resultCode, intent);
}
return super.onKeyDown(keyCode, event);
}
Activity之间跳转,Intent的设置
你可能想说博主怎么这么多问题???哈哈哈哈哈!一起来探讨一下呗,反正我也刚想知道。
public Intent getIntent() {
return mIntent;
}
我们去Activity
的startActivity(intent)
跳转过程中去查询,当然代码太多了,我就直接总结好了。
startActivity() --> startActivityForResult() --
--> Instrumentation.execStartActivity() --> IActivityTaskManager.startActivity() --
--> 进入了一个.aidl文件然后我也不知道了,但是肯定是在这里办正事儿的
探索发现:
(1)我们的数据,也就是Intent
中使用putExtra(key, value)
放置的数据最后都被封装进了Bundle
,所以说Bundle
其实就是我们Activity
之间数据传递的媒介。
(2)而Activity
的跳转也是基于一个Binder
的机制来完成的,当然问我为啥呢。我也只能说因为包里找不到,基本上只会是.aidl
文件,然后结合以前看的网上的解析都是说基于Binder
的机制。
当然我的问题并没有解决,等我以后知识储备够了再来分析一下底层。
总结
其实上面都讲的差不多了,这里说一个实际会碰到的问题把。
就是static
、Handler
、ServiceConnection
这一类可能会引发的内存泄漏问题。他们存在解决方法,其实多种多样,但更多一般也都是基于生命周期来完成的。一般解法都是在onDestroy()
进行置空操作、或是解绑这一类方法把。
