先出一个题吧,Activity A 跳转Activity B,再从Activity B按back键回退,两个过程各自的生命周期?java
这是一个比较简单的生命周期问题,可是不少人会答错。那咱们就对整个生命周期进行一个分析,再给出答案好了。而且文章内有一些内容我已经写过了,都是经过给出连接方式跳转查看了,请见谅。bash
这儿重点要知道的是下面这两对各自之间的区别的区别。ide
(1)onPause()
和onStop()
post
(2)onStart()
和onResume()
学习
onPause()
说明当前的Activity
已经暂停,但你并非说暂停的意思只是没有了动做,而调用了onStop()
才让Acivity
不可见。onStart()
也是同样,只是说Activity
已经能够启动了,但这个时候页面仍是不可见的,只有调用了onResume()
页面才可以可见,页面跳转也是如此。this
如今在回答一下以前的问题,Activity A 跳转Activity B,再从Activity B按back键回退,两个过程各自的生命周期?spa
详见于几张图让你明白Android四大启动模式3d
详见于Android事件分发机制,你了解过吗?rest
这里说一下为何我要把这个模块放在Activity
,明明这个机制涉及的有三方Activity
、ViewGroup
、View
。code
其实个人思考主要是由于Activity
是接受到这些动做的第一人,而不论是ViewGroup
仍是View
,都是后来通过一个事件的分发后,才有的他们的处理,因此我将事件分发机制归结于此。
在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);
}
复制代码
你可能想说博主怎么这么多问题???哈哈哈哈哈!一块儿来探讨一下呗,反正我也刚想知道。
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()
进行置空操做、或是解绑这一类方法把。
以上就是个人学习成果,若是有什么我没有思考到的地方或是文章内存在错误,欢迎与我分享。
相关文章推荐: