前言
想起来写这个是因为之前在开发过程中遇到在onStart()方法中使用getIntent()方法无法获取到启动activity时传入的数据,也是纳闷了很久,然后就决定好好看一下这个地方,本文章会结合简单的demo先说说四个启动模式,搞清楚启动模式之后,就明白为什么getIntent()得不到我们想要的数据了。
开发环境: Android Studio 3.0.1
设备: 逍遥安卓 5.1.1
解决办法
因为感觉文章写的非常啰嗦,但是又怕讲的不够清楚,如果想直接找到解决方案的可以直接看这里。重写目标Activity的onNewIntent方法。然后你就能在onStart中通过getIntent得到正确的值了。
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
Android四种启动模式
1. standard
默认启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。
2. singleTop
如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。
3. singleTask
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
4. singleInstance
在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。
Activity启动模式设置:
<activity android:name=".MainActivity" android:launchMode="standard" />
DEMO
只是看概念可能会有一些抽象,所以就结合代码示例来理解下,当然其实我觉得在经过一段时间的开发后,我们应该要能通过官方文档就理解知识点,我们需要具备这种能力,才能提高学习效率。这都是题外话,接下来就顺着代码分析。
首先为了减少重复代码写一个基类Activity,加上我们需要的日志。这里我们有一点要注意的地方,不要用系统的返回按钮返回到主界面,因为那样会销毁当前的Activity的,所以在当前Activity上加一个按钮用来返回主界面。为了看看不同启动模式Activity的区别,所以就让启动的Activity到后台而不是销毁掉。
如图所示,点击BACK按钮返回主界面,而不是小三角。
/**
* Created by wanghang on 2018/5/17.
*/
public class BaseActivity extends Activity {
private String TAG = this.getClass().getSimpleName();
@Override
protected void