刚开始学的时候
咦,我刚退了这个页面,怎么又退出来了
咦,怎么又崩溃了
咦,gradle怎么配置呀,又报红了!?
想弄清楚,那就看下面的讲解吧,详细这是初学者经常遇见的问题。
之前的大神有讲解的相当详细的推荐过来:
Android中Activity四种启动模式和taskAffinity属性详解
启动模式一共有四种(初学者面试常问):
可以在AndroidManifest.xml中通过给标签指定android:launchMode属性来选择启动模式。
Android启动提供了四种启动方式:
Standard
)SingleTop
)SingleTask
)SingleInstance
)知识储备:
特点:后进先出
Activity的管理方式 = 任务栈
任务栈 采用的结构 = “后进先出” 的栈结构
每按一次Back键,就有一个Activity出栈
standard
是活动默认的启动模式,在不进行显式指定的情况下,所有活动都会自动使用这种启动模式。在standard模式下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于使用standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。
当活动的启动模式指定为singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。
不管你点击多少次按钮都不会再有新的打印信息出现,因为目前firstActivity已经处于返回栈的栈顶,每当想要再启动一个firstActivity时都会直接使用栈顶的活动,因此firstActivity也只会有一个实例,仅按一次Back键就可以退出程序。
注意:当firstActivity并未处于栈顶位置时,这时再启动firstActivity,还是会创建新的实例的。
每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
这个模式是四种启动模式中最特殊也最复杂的一个了。
假设我们的程序中有一个活动是允许其他程序调用的,如果我们想实现其他程序和我们的程序可以共享这个活动的实例,如何实现?
使用前三种启动模式肯定是做不到的,因为每个引用程序都有自己的返回栈,同一个活动在不同的返回栈中入栈时必须是创建了新的实例,而使用singleInstance模式就可以解决。
在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,解决共享活动的实例的问题。
1.在AndroidMainifest的Activity配置进行设置
<activity
android:launchMode="启动模式"
//属性
//standard:标准模式
//singleTop:栈顶复用模式
//singleTask:栈内复用模式
//singleInstance:单例模式
//如不设置,Activity的启动模式默认为**标准模式(standard)**
</activity>
2.在代码中通过Intent设置标志位
Intent inten = new Intent (ActivityA.this,ActivityB.class);
intent,addFlags(Intent,FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
标记位属性 | 含义 |
---|---|
FLAG_ACTIVITY_SINGLE_TOP | 指定启动模式为栈顶复用模式(SingleTop) |
FLAG_ACTIVITY_NEW_TASK | 指定启动模式为栈内复用模式(SingleTask) |
导FLAG_ACTIVITY_CLEAR_TOP | 所有位于其上层的Activity都要移除,SingleTask模式默认具有此标记效果 |
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | 具有该标记的Activity不会出现在历史Activity的列表中,即无法通过历史列表回到该Activity上 |
优先级不同
Intent设置方式的优先级 > Manifest设置方式,即 以前者为准
限定范围不同
Manifest设置方式无法设定 FLAG_ACTIVITY_CLEAR_TOP;Intent设置方式 无法设置单例模式(SingleInstance)
一、知晓当前是在哪个活动。
二、随时随地退出程序
可以再销毁所有活动的代码后面再加上杀掉当前进程的代码,以保证程序完全退出,杀掉进程的代码如下所示:
android.os.Process.killProcess(android.os.Process.myPid());
其中,killProcess()方法用于杀掉一个进程,它接收一个进程id参数,我们可以通过myPid()方法来获得当前程序的进程id。需要注意的是,killProcess()方法只能用于杀掉当前的程序的进程,不能杀掉其他进程。
三、启动活动的最佳写法
启动活动的方法相信你已经非常熟悉了,首先通过Intent构建出当前的意图,然后调用startActivity()
或startActivityForResult()
方法将活动启动起来,如果有数据需要从一个活动传递到另一个活动,也可以借助intent来完成。