Activity的启动模式非常重要,也是面试常常会问到的问题。因为比较抽象,所以对于初学者来说还是比较难以深刻理解的,所以我觉得还是图文简介才能更通俗地理解它。
在学习四大启动模式之前,我们必须先学习并理解返回栈这个知识点。
栈是一种先进后出的数据结构。
如右图所示:把返回栈比喻成一个容器,Activity实例是物品,且刚刚好大小能放进去。
最先进栈的Activity实例1只能最后出来,而最迟进栈的Activity实例4则处于栈顶,最先出来。
相信这样子很容易理解返回栈的基本概念了吧。
顺便提一下Activity生命周期中的几种状态:
接下来我们可以开开心心地学习Activity的四大启动模式啦!
Activity的启动模式一共四种,standard、singleTop、singleTask、和singleInstance。
如何选择你需要的Activity启动模式呢?在AndroidManifest.xml清单文件中通过给<activity>标签指定android:lauchMode属性来确定
在这种模式下,系统保证无论从哪个返回栈(Task)中启动目标Activity,只会创建一个目标Activity实例,并会用一个全新的返回栈来加载该Activity实例。
例如:将要以这种模式来启动MainActivity
情况1:如果将要启动的MainActivity实例不存在,系统会先创建一个新的返回栈(Task)再创建MainActivity实例,并且将MainActivity实例添加到栈顶。
情况2:如果将要启动的目标Activity已经存在,无论它位于哪个应用程序中、位于哪个返回栈(Task)中,系统都会将该Activity所在的返回栈(Task)转到前台,使该Activity显示出来。
Activity有单例模式共享Activity实例。
我们平常写代码在适合的场合也会用到单例模式获取对象,以此达到节约资源的目的(但不可滥用)
下面贴一个自己写的单例模式获取对象,用到了Volley框架,说不定有时候会用到呢!
<span style="font-size:18px;">单例模式获取队列对象
import android.content.Context;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
public class HttpUtils {//单例模式
private RequestQueue mQueue;
private static HttpUtils mInstance;
private HttpUtils(Context context){
mQueue = Volley.newRequestQueue(context);
}
/**
* 获取单例对象的公开静态方法
* @param context
* @return
*/
public static HttpUtils getInstance(Context context){
if (mInstance == null){
synchronized (HttpUtils.class){
if (mInstance == null){
mInstance = new HttpUtils(context);
}
}
}
return mInstance;
}
/**
* 把请求加入队列的方法
* @param req
*/
public void sendRequest(Request req){
mQueue.add(req);
}
}</span>