在《JAVA数据结构及算法--Stack分析》和《JAVA数据结构及算法--Stack应用》文章中分析了JAVA源码中栈的实现及实现自定义的栈及栈的简单应用(单词逆序和分隔符匹配),接下来介绍栈在Android中的应用。Android中Activity的四种启动模式分别是:standard,singleTop,singleTask,singleInstance。standard,singleTop,singleTask会在相同的栈中操作,而singleInstance会在独立的栈中。主要通过两个A_activity和B_activity来分析这四种模式,切换不同的模式通过修改AndroidManifest.xml中A_activity类配置中的android:launchMode="standard"属性来实现。代码实现如下:

AndroidManifest.xml文件如下:

<?xml version="1.0" encoding="utf-8"?>                                                                                        

A_activity.java类

package com.android.launchmode;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;public class A_activity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        Logger.d(this.toString()+ " ,taskId: " + this.getTaskId());        super.onCreate(savedInstanceState);        setContentView(R.layout.a_activity);    }    public void onA_TO_A(View view){        Logger.d(this.toString());        Intent intent = new Intent();        intent.setClass(A_activity.this, A_activity.class);        startActivity(intent);    }    public void onA_TO_B(View view){        Logger.d(this.toString());        Intent intent = new Intent();        intent.setClass(A_activity.this, B_activity.class);        startActivity(intent);    }    public void onA_back(View view){        Logger.d(this.toString()+ " ,taskId: " + this.getTaskId());        finish();    }    public A_activity() {        super();        Logger.d(this.toString());    }    @Override    protected void onStart() {        super.onStart();        Logger.d(this.toString());    }    @Override    protected void onRestart() {        super.onRestart();        Logger.d(this.toString());    }    @Override    protected void onResume() {        super.onResume();        Logger.d(this.toString());    }    @Override    protected void onNewIntent(Intent intent) {        super.onNewIntent(intent);        Logger.d(this.toString()+ " ,taskId: " + this.getTaskId());    }    @Override    protected void onPause() {        super.onPause();        Logger.d(this.toString());    }    @Override    protected void onStop() {        super.onStop();        Logger.d(this.toString());    }    @Override    protected void onDestroy() {        super.onDestroy();        Logger.d(this.toString());    }}
package com.android.launchmode;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;public class B_activity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        Logger.d(this.toString()+ " ,taskId: " + this.getTaskId());        super.onCreate(savedInstanceState);        setContentView(R.layout.b_activity);    }    public void onB_TO_A(View view){        Logger.d(this.toString());        Intent intent = new Intent();        intent.setClass(B_activity.this, A_activity.class);        startActivity(intent);    }    public void onB_back(View view){        Logger.d(this.toString()+ " ,taskId: " + this.getTaskId());        finish();    }    public B_activity() {        super();        Logger.d(this.toString());    }    @Override    protected void onStart() {        super.onStart();        Logger.d(this.toString());    }    @Override    protected void onRestart() {        super.onRestart();        Logger.d(this.toString());    }    @Override    protected void onResume() {        super.onResume();        Logger.d(this.toString());    }    @Override    protected void onNewIntent(Intent intent) {        super.onNewIntent(intent);        Logger.d(this.toString()+ " ,taskId: " + this.getTaskId());    }    @Override    protected void onPause() {        super.onPause();        Logger.d(this.toString());    }    @Override    protected void onStop() {        super.onStop();        Logger.d(this.toString());    }    @Override    protected void onDestroy() {        super.onDestroy();        Logger.d(this.toString());    }}

 Logger.java类

package com.android.launchmode;import android.util.Log;import java.util.Locale;public class Logger {    public static final boolean DEBUG = true;    public static final String DEFAULT_TAG = "MODE_";    public Logger(){}//    public static void d(String tag, String msg){//        if (!ENABLE_LOG){//            return;//        }////        Log.d(tag +"_" + getClassName(), callMethodAndLine(-1) + ": " +msg);//    }//    public static void d(String msg){//        if (!ENABLE_LOG){//            return;//        }////        Log.d(DEFAULT_TAG +"_" + getClassName(), callMethodAndLine(-1) + ": " + msg);//    }//    public static void d(){//        if (!ENABLE_LOG){//            return;//        }////        Log.d(DEFAULT_TAG +"_" + getClassName(), callMethodAndLine(-1));//    }////    private  static String getClassName(){//        String result;//        StackTraceElement thisMethodStack = (new Exception()).getStackTrace()[2];//        result = thisMethodStack.getClassName();//        int lastIndex = result.lastIndexOf(".");//        result = result.substring(lastIndex + 1, result.length());//        return result;//    }//////    private static String callMethodAndLine(){//        String result = "at ";//        StackTraceElement thisMethodStack = (new Exception()).getStackTrace()[2];//        result += thisMethodStack.getClassName() + ".";//        result += thisMethodStack.getMethodName();//        result += "(" + thisMethodStack.getFileName();//        result += ":" + thisMethodStack.getLineNumber() + ")";////        return result;//    }//    private static String callMethodAndLine(int i){//        String result = "at ";//        StackTraceElement thisMethodStack = (new Exception()).getStackTrace()[2];////        result += thisMethodStack.getClassName() + ".";//        result += thisMethodStack.getMethodName();//        result += "(" + thisMethodStack.getFileName();//        result += ":" + thisMethodStack.getLineNumber() + ")";////        return result;//    }    public static void d(){        if (DEBUG){            Log.d(DEFAULT_TAG,getPrefix());        }    }    public static void d(String msg){        if (DEBUG){            Log.d(DEFAULT_TAG,  getPrefix() + msg);        }    }    public static void d(String msg, Throwable tr){        if (DEBUG){            Log.d(DEFAULT_TAG, getPrefix() + msg, tr);        }    }    private static String getPrefix(){        StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[4];        String className = stackTraceElement.getClassName();        int classNameStartIndex = className.lastIndexOf(".") + 1;        className = className.substring(classNameStartIndex);        String methodName = stackTraceElement.getMethodName();        int methodLine = stackTraceElement.getLineNumber();        String format = "%s_%s(L:%d)";        return String.format(Locale.CANADA, format, className, methodName, methodLine);    }}

 

1、standard模式(默认模式):AndroidManifest.xml中A_activity类配置中的android:launchMode="standard"属性来实现这种模式。每次启动一个Activity都会又一次创建一个新的实例入栈,无论这个实例是否存在。每次被创建的实例Activity 的生命周期符合典型情况,它的onCreate、onStart、onResume都会被调用。A_activity出入栈如下:

A_activity布局:

JAVA数据结构及算法--Android中Activity的四种启动模式_第1张图片

 

JAVA数据结构及算法--Android中Activity的四种启动模式_第2张图片

JAVA数据结构及算法--Android中Activity的四种启动模式_第3张图片 2、singleTop模式(也叫栈顶复用):AndroidManifest.xml中A_activity类配置中的android:launchMode="singleTop"属性来实现这种模式。

分两种处理情况:须要创建的Activity已经处于栈顶时,此时会直接复用栈顶的Activity。不会再创建新的Activity;若须要创建的Activity不处于栈顶,此时会又一次创建一个新的Activity入栈,同Standard模式一样。若情况一中栈顶的Activity被直接复用时,它的onCreate、onStart不会被系统调用,由于它并没有发生改变。可是一个新的方法 onNewIntent会被回调(Activity被正常创建时不会回调此方法)。A_activity和B_activity出入栈如下:

A_activity布局:

JAVA数据结构及算法--Android中Activity的四种启动模式_第4张图片

B_activity布局:

JAVA数据结构及算法--Android中Activity的四种启动模式_第5张图片

JAVA数据结构及算法--Android中Activity的四种启动模式_第6张图片

JAVA数据结构及算法--Android中Activity的四种启动模式_第7张图片

  3、singleTask模式(也叫栈内复用):AndroidManifest.xml中A_activity类配置中的android:launchMode="singleTask"属性来实现这种模式。若须要创建的Activity已经处于栈中时,此时不会创建新的Activity,而是将存在栈中的Activity上面的其他Activity进行销毁,使它成为栈顶。生命周期:同SingleTop 模式中的情况一同样。仅仅会又一次回调Activity中的 onNewIntent方法,A_activity和B_activity出入栈如下:

JAVA数据结构及算法--Android中Activity的四种启动模式_第8张图片

4、singleInstance模式(也叫单实例模式):AndroidManifest.xml中A_activity类配置中的android:launchMode="singleInstance"属性来实现这种模式。  SingleInstance比較特殊,是全局单例模式,是一种加强的SingleTask模式。它除了具有它所有特性外,还加强了一点:具有此模式的Activity仅仅能单独位于一个任务栈中,这里A_activity具有单独的栈。A_activity和B_activity出入栈如下:

JAVA数据结构及算法--Android中Activity的四种启动模式_第9张图片

JAVA数据结构及算法--Android中Activity的四种启动模式_第10张图片

参考博客《Android:四种启动模式分析》

更多相关文章

  1. Android飞行模式下Wifi开关行为的控制
  2. android典型代码系列(三十)------DES加密算法
  3. Android WindowManager的使用 & 添加 遮罩层 实现夜间模式
  4. Android情景模式、文件管理器 完整示例编程详解、Android程序优
  5. Android的NDK开发(4)————JNI数据结构之JNINativeMethod
  6. 设置屏幕显示模式ScreenOrientation.
  7. Android 建造者(Builder)模式
  8. Android开发之Activity(二)——启动模式和taskAffinity属性

随机推荐

  1. Android(安卓)高级自定义Toast及源码解析
  2. android 实现自动输入文本效果
  3. Android(安卓)AMS(三) App启动过程之onRe
  4. 【Android】 解析Json 数据示例
  5. Android(安卓)SDK 开发环境安装
  6. Android之旅 笔记总结(一)
  7. Android(安卓)Studio第十九期 - Glin架构
  8. Android使用Notification通知栏功能的封
  9. 手把手教你使用MPAndroidChart实现柱状图
  10. 控制状态栏、导航栏、实现沉浸式模式