• Android activity的启动模式


    自己的理解加上网上的一些资料总结了关于activity的四种启动模式

    在实际项目中我们应该依据特定的需求 为每一个活动指定恰当的启动模式。

    启动模式一共同拥有四种,各自是 standard、singleTop、 singleTask 和 singleInstance,可 以在 AndroidManifest.xml 中通 过给<activity>标签 指定 android:launchMode属性来选择启动模式。

    1,standard(这是活动的一个标准模式,在创建活动的时候默认是这个模式)

    在 standard模式下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于使用 standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建 该活动的一个新的实例。

    接下来通过一段代码来了解一下。

    @Override protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    Log.d("FirstActivity", this.toString());

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.first_layout);

    Button button1 = (Button) findViewById(R.id.button_1);


    button1.setOnClickListener(new OnClickListener() {

    @Override public void onClick(View v) {

    Intent intent = new Intent(FirstActivity.this, FirstActivity.class);

    startActivity(intent);

    } });
    }

    我个人觉得代码跟截图应该挺清晰的说明了问题所在,所以我就不再说明了。

    2,singleTop

    使用singleTop模式。当活动的启动模式指定为 singleTop,在启动活动时假设发现返回栈的栈顶已经是该活动。则觉得能够直接使用它。不会再创建新的活动实例。

    如今在AndroidManifest.xml中改动Activity的启动模式(android:launchMode="singleTop")

    然后又一次执行程序,查看 LogCat

    我个人觉得代码跟截图应该挺清晰的说明了问题所在,所以我就不再说明了。

    3, singleTask

    当活动的启动模式指定为 singleTask。每次启动该活动时系统首先 会在返回栈中检查是否存在该活动的实例。假设发现已经存在则直接使用该实例,并把在这 个活动之上的全部活动统统出栈。假设没有发现就会创建一个新的活动实例。

    如今在AndroidManifest.xml中改动Activity的启动模式(android:launchMode="singleTask")

    然后在 FirstActivity中加入 onRestart()方法。并打印日志:

    @Override protected void onRestart() {

    super.onRestart();

    Log.d("FirstActivity", "onRestart");

    }

    最后在 SecondActivity中加入 onDestroy()方法,并打印日志:

    @Override protected void onDestroy() {

    super.onDestroy(); Log.d("SecondActivity", "onDestroy");

    }

    如今又一次执行程序,在 FirstActivity 界面点击button进入到 SecondActivity。然后在 SecondActivity界面点击button,又会又一次进入到 FirstActivity。

    然后又一次执行程序。查看 LogCat

    4。singleInstance

    singleInstance模式应该算是四种启动模式中最特殊也最复杂的一个了,指定为 singleInstance模式的活动会启用一 个新的返回栈来管理这个活动。

    我也不好解释,什么都不说了,上代码。

    先改动 AndroidManifest. xml中 SecondActivity的启动模式(android:launchMode="singleInstance")

    FirstActivity 中 onCreate()方法的代码:

    @Override protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    Log.d("FirstActivity", "Task id is " + getTaskId());

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.first_layout);

    Button button1 = (Button) findViewById(R.id.button_1);

    button1.setOnClickListener(new OnClickListener() {

    @Override public void onClick(View v) {

    Intent intent = new Intent(FirstActivity.this, SecondActivity.class);

    startActivity(intent);

    } }); }

    在 onCreate()方法中打印了当前返回栈的 id。

    然后改动 SecondActivity中 onCreate()方法 的代码:

    @Override protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    Log.d("SecondActivity", "Task id is " + getTaskId());

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.second_layout);

    Button button2 = (Button) findViewById(R.id.button_2);

    button2.setOnClickListener(new OnClickListener() {

    @Override public void onClick(View v) {

    Intent intent = new Intent(SecondActivity.this, ThirdActivity.class);

    startActivity(intent);

    }});
    }

    相同在 onCreate()方法中打印了当前返回栈的 id,然后又改动了button点击事件的代码, 用于启动 ThirdActivity。

    最后改动 ThirdActivity中 onCreate()方法的代码:

    @Override protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    Log.d("ThirdActivity", "Task id is " + getTaskId());

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.third_layout);

    }

    仍然是在 onCreate()方法中打印了当前返回栈的 id。

    如今又一次执行程序。在 FirstActivity 界 面 点 击 按 钮 进入 到 SecondActivity, 然 后 在 SecondActivity 界 面 点 击 按 钮 进入 到 ThirdActivity。执行程序。看LogCat中的信息。

    这个模式比較麻烦,我也解释不好。能力有限,大家看看截图看看代码自己理解吧。

    本文自己胡乱杜撰的,如有雷同纯属巧合(那些原理示意图是网上找的)

    本人不承担不论什么看不懂不理解写错的风险!

    !!


  • 相关阅读:
    js面向对象和PHP面相对象
    git
    css3动画、2D与3D效果
    渲染数据方式
    ajax
    面向对象
    Date 日期
    Math 数值对象
    What is CGLib and JDK动态代理
    IDEA中lock对象不提示newCondition();
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7284628.html
Copyright © 2020-2023  润新知