Android的四种LauchMode

Android使用任务栈Task来管理活动,一个任务就是一组存放在栈里的活动的集合,也称为返回栈。

栈是一种后进先出的数据结构。

每当启动一个新的活动,它会在返回栈中入栈,并处于栈顶的位置。

每当按下Back键或者调用finish()方法去销毁一个活动时,处于栈顶的活动会出栈。

Android启动模式一共四种,分别是standard、singleTop、singleTask、singleInstance。

在AndroidManifest.xml中通过标签指定android:launchMode属性设置启动模式。

standard

默认模式,每当启动一个新的活动,就会在返回栈中入栈,并处于栈顶的位置。

每次启动都会创建该活动的一个实例。

public class MainActivity extends AppCompatActivity{

private static String TAG = "MainActivity";

@Override

protected void onCreate(final Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TextView textView = (TextView) findViewById(R.id.textView);

textView.setText(this.toString());

Log.i(TAG, this.toString());

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

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

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

startActivity(intent);

}

});

}

点击Button两次 创建两个新的MainActivity实例,需要点击三次back才能退出程序。

I/MainActivity: com.example.wkyyc.viewpagerdemo.MainActivity@a79416d

I/MainActivity: com.example.wkyyc.viewpagerdemo.MainActivity@1691d81

I/MainActivity: com.example.wkyyc.viewpagerdemo.MainActivity@cff6062

singleTop

当活动的启动模式指定为singleTop,在启动活动时如果发现返回栈的栈顶是该活动,则通过调用onNewIntent()方法进行复用,不会再创建新的活动实例。

在AndroidManifest中设置

android:launchMode="singleTop">

public class MainActivity extends AppCompatActivity{

private static String TAG = "MainActivity";

@Override

protected void onCreate(final Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TextView textView = (TextView) findViewById(R.id.textView);

textView.setText(this.toString());

Log.i(TAG, this.toString());

Log.i(TAG, "onCreate走一遍");

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

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

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

startActivity(intent);

}

});

}

@Override

protected void onStart(){

super.onStart();

Log.i(TAG, "onStart走一遍");

}

}

点击Button不会创建新的实例,生命周期也不重新走。仅按一次back就可以退出程序。

如果MainActivity并未处于栈顶位置,再启动MainActivity,还是会创建新的实例。

创建一个SecondActivity

在MainActivity中点击跳转到SecondActivity。

public class MainActivity extends AppCompatActivity{

private static String TAG = "MainActivity";

@Override

protected void onCreate(final Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Log.i(TAG, this.toString());

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

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

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

startActivity(intent);

}

});

}

}

启动程序,创建MainActivity的实例

MainActivity: com.example.wkyyc.viewpagerdemo.MainActivity@a79416d

点击Button按钮,跳转到SecondActivity,创建了SecondActivity的实例,SecondActivity在栈顶位置,MainActivity不在栈顶。

MainActivity: com.example.wkyyc.viewpagerdemo.SecondActivity@ffdc014

当在SecondActivity中点击Button按钮,MainActivity未在栈顶,MainActivity回到栈顶,创建MainActivity实例。

public class SecondActivity extends AppCompatActivity {

private static String TAG = "MainActivity";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_second);

Log.i(TAG, this.toString());

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

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

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

startActivity(intent);

}

});

}

}

I/MainActivity: com.example.wkyyc.viewpagerdemo.MainActivity@2354529

现在按下back返回到SecondActivity,再按back返回MainActivity,再按back退出程序。

singleTask

当活动的启动模式指定为singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如存在直接调用onNewIntent()方法复用该实例,并把在这个活动之上的所有活动统统出栈,在栈内没有则会创建一个新的实例。

设置MainActivity的启动模式为singleTask,重写MainActivity的onRestart()方法。重写SecondActivity的onDestroy()方法。重写SecondActivity的onDestroy

MainActivity代码

启动程序,生成MainActivity实例。

public class MainActivity extends AppCompatActivity{

private static String TAG = "MainActivity";

@Override

protected void onCreate(final Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Log.i(TAG, this.toString());

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

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

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

startActivity(intent);

}

});

}

@Override

protected void onRestart(){

super.onRestart();

Log.i(TAG, "onRestart: ");

}

}

I/MainActivity: com.example.wkyyc.viewpagerdemo.MainActivity@a79416d

点击Button按钮,跳转到SecondActivity,创建了SecondActivity的实例

/MainActivity: com.example.wkyyc.viewpagerdemo.SecondActivity@3850e26

点击SecondActivity的Button按钮,跳转到MainActivity。

public class SecondActivity extends AppCompatActivity {

private static String TAG = "MainActivity";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_second);

Log.i(TAG, this.toString());

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

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

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

startActivity(intent);

}

});

}

@Override

protected void onDestroy(){

super.onDestroy();

Log.i(TAG, "onDestroy ");

}

}

MainActivity跳转到SecondActivity时,SecondActivity处于栈顶,点击SecondActivity的Button时,MainActivity设置为singleTask模式,在栈中存在MainActivity的实例,所以直接复用MainActivity的实例,而且还在SecondActivity实例的下面,于是SecondActivity会从返回栈中出栈,而MainActivity会成为新的栈顶,因此MainActivity的onRestart()方法和SecondActivity的onDestroy()方法会执行。

MainActivity: onRestart:

MainActivity: onDestroy

四种启动方式应用场景

singleTop适合接收通知启动的内容显示页面。

例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。

singleTask适合作为程序入口点。

例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。

singleInstance适合需要与程序分离开的页面。

例如闹铃提醒,将闹铃提醒与闹铃设置分离。系统的来电页面,多次来电均是使用的同一个Activity。

singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。

代码中设定LauchMode

启动 Activity ,我们需要传递一个 Intent,完全可以通过设置 Intent.setFlags(int flags) 来设置启动的 Activity 的启动模式。

需要注意的是:通过代码来设置 Activity 的启动模式的方式,优先级比清单文件设置更高。

FLAG_ACTIVITY_NEW_TASK

这个标识会使新启动的 Activity 独立创建一个 Task。

FLAG_ACTIVITY_CLEAR_TOP

这个标识会使新启动的 Activity 检查是否存在于 Task 中,如果存在则清除其之上的 Activity,使它获得焦点,并不重新实例化一个 Activity,一般结合 FLAG_ACTIVITY_NEW_TASK 一起使用。

FLAG_ACTIVITY_SINGLE_TOP

等同于在 launcherMode 属性设置为 singleTop。

android10如何设置打开方式,Android启动方式相关推荐

  1. android使用其他应用打开方式,Android 启动activity的4种方式及打开其他应用的activity的坑...

    Android启动的四种方式分别为standard,singleTop,singleTask,singleInstence. standard是最常见的activity启动方式,也是默认的启动的方式. ...

  2. ubuntu 设置打开文件的默认方式

    右键->文件->属性->打开方式->选中要打开的程序->设置为默认值

  3. Windows 启动方式总结(转)

    一.自启动项目: 开始---程序---启动,里面添加一些应用程序或者快捷方式. 这是Windows 里面最常见,以及应用最简单的启动方式,如果想一些文件开机时候启动,那么也可以将他拖入里面或者建立快捷 ...

  4. 启动指定参数_SpringBoot的三种启动方式

    1.背景 这几天在看面试题,看到了有关SpringBoot的相关知识点,其中有一个问题是:"SpringBoot有哪几种启动方式?".一下子懵逼了,脑子里面只记得在本地启动的时候是 ...

  5. 万事开头难 - 介绍IMX6ULL启动方式

    不同开发板,启动方式不一样,今天我们来介绍imx6ull开发板的启动方式,这非常重要.若不了解清楚启动方式,后面的所有开发工作便无从谈起. 本文摘自100ask_imx6ull 开发板 配套学习手册- ...

  6. 韦东山 IMX6ULL和正点原子_万事开头难 - 介绍IMX6ULL启动方式

    不同开发板,启动方式不一样,今天我们来介绍imx6ull开发板的启动方式,这非常重要.若不了解清楚启动方式,后面的所有开发工作便无从谈起. 本文摘自100ask_imx6ull 开发板 配套学习手册- ...

  7. 方式SingleTask 启动Intent设置 不能如愿打开需要的Activity

    问题解决记录: 环境:APP主界面的启动方式SingleTask. 当主界面在前台的时候,全局Application接收到广播,打开SingleTask本APP语音通话界面,一切操作正常. 问题出现: ...

  8. Android中Activity的四种启动方式

    谈到Activity的启动方式必须要说的是数据结构中的栈.栈是一种只能从一端进入存储数据的线性表,它以先进后出的原则存储数据,先进入的数据压入栈底,后进入的数据在栈顶.需要读取数据的时候就需要从顶部开 ...

  9. Android启动Activity的两种方式与四种启动模式

    1.在一个Activity中调用startActivity()方法 2.在一个Activity中调用startActivityRequest()方法. 重写onActivityResult方法,用来接 ...

最新文章

  1. Ubuntu下安装ruby的三种方式
  2. Class.forName解析以及使用
  3. python属性使用教程_Python对象的属性访问过程详解
  4. go mysql存储过程_Golang 调用MySQL存储过程
  5. 2021牛客多校3 - Kuriyama Mirai and Exclusive Or(差分+倍增)
  6. kubernetes实战篇之helm示例yaml文件文件详细介绍
  7. 快手有佳人|2020快手女性人群价值报告
  8. MySQL5.6忘记root用户名和密码
  9. Macbook Pro笔记本双系统MacOS和Windows切换默认启动
  10. 能够快速赚到钱的,一般就三类人
  11. Alien Skin Exposure7滤镜软件功能作用
  12. 拉普拉斯方程式 Laplace's equation
  13. 国开大学计算机原理边学边练,国家开放大学计算机组成原理
  14. 原生开发什么意思_原生App是什么意思
  15. 开博尔智能android播放器,高端安卓播放器的选择——开博尔Q10Plus 二代 4K高清播放器...
  16. VS2010 旗舰版序列号
  17. Error: Cannot find module ‘C:\Users\AppData\Roaming\npm\node_modules\..错误,解决方法
  18. OpenGL超级宝典笔记——光照参数与材料属性
  19. 微信小程序跳转第三方页面
  20. 可变悬挂调节软硬_可变悬架软硬怎么调节高度

热门文章

  1. Oracle char 查询问题
  2. 0-1背包(及初始化问题)
  3. 【教程】jQuery打造动态下滑菜单
  4. 几款让你爱不释手的语音转文字软件
  5. 使用jQuery操作input的value值
  6. 教你如何用手机查看哪些人在蹭你家的WIFI,然后将他们屏蔽!
  7. 使用exe4j打包Java程序
  8. Android开发学习——Android Studio配置SVN
  9. js中的 arguments ,实参的集合
  10. include *.h 和 declare class *; 的区别?