android入门-Activity的四种启动模式详解

来源:互联网 发布:k歌达人for mac 编辑:程序博客网 时间:2024/05/18 00:47
今天来说一下Android中四大组件之一的Activity的启动模式
    一共有四种,分别为:
  • Standard   模式
        这是默认模式,当我们不设置启动模式的时候,就默认为此模式,此模式的特征为:我们每创建一个Activity都会创建一个实例,并放入任务栈中
  • singleTop 模式
        我们打开一个Acitivity,如果该Activity已经被创建过, 并且目前在栈顶,则会直接复用此实例,不在创建。如果不在栈顶,则重新创建实例,压入栈中。
  • singleTask 模式
        这种模式就是,我们打开一个Activity,如果已经存在过这个Activity的实例,就会直接复用该实例。如果该实例在栈顶,则复用,如果不在栈顶,则会移除在它上面的所有实例,使其自身处于栈顶,并复用。
  • singleInstance 模式
        在此模式中,我们打开一个Activity,就会重新创建一个任务栈用来存放这个实例,并让多个应用共享该栈中所存在的该Activity的实例。一旦改市模式的Activity实例已经存在某个栈中,任何应用激活该Activity都会复用该栈中的实例。
上面我介绍了基本概念,我也是从小小白进阶到现在的小白,只看这些概念并不能理解其中的奥妙,所以我写了一个例子,用代码和图片进行详细描述。
代码如下:
这是第一个activity的代码
  1. public class OneActivity extends AppCompatActivity implements View.OnClickListener {
  2. @Bind(R.id.one)
  3. Button one;
  4. @Bind(R.id.two)
  5. Button two;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. ButterKnife.bind(this);
  11. initClick();
  12. }
  13. private void initClick() {
  14. one.setOnClickListener(this);
  15. two.setOnClickListener(this);
  16. }
  17. @Override
  18. public void onClick(View v) {
  19. switch (v.getId()) {
  20. case R.id.one:
  21. Intent intent1 = new Intent(this, OneActivity.class);
  22. startActivity(intent1);
  23. break;
  24. case R.id.two:
  25. Intent intent2 = new Intent(this,TwoActivity.class);
  26. startActivity(intent2);
  27. }
  28. }
  29. }
这是第二个activity的代码
  1. public class TwoActivity extends AppCompatActivity implements View.OnClickListener {
  2. @Bind(R.id.one)
  3. Button one;
  4. @Bind(R.id.two)
  5. Button two;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_demo);
  10. ButterKnife.bind(this);
  11. initClick();
  12. }
  13. private void initClick() {
  14. one.setOnClickListener(this);
  15. two.setOnClickListener(this);
  16. }
  17. @Override
  18. public void onClick(View v) {
  19. switch (v.getId()) {
  20. case R.id.one:
  21. Intent intent1 = new Intent(this, OneActivity.class);
  22. startActivity(intent1);
  23. break;
  24. case R.id.two:
  25. Intent intent2 = new Intent(this,TwoActivity.class);
  26. startActivity(intent2);
  27. }
  28. }
  29. }
然后我们在AndroidManifest文件中配置启动模式,当然也可以代码中配置,在最后我会说怎么在代码中配置
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.wq.demo">
  4. <application
  5. android:allowBackup="true"
  6. android:icon="@mipmap/ic_launcher"
  7. android:label="@string/app_name"
  8. android:supportsRtl="true"
  9. android:theme="@style/AppTheme">
  10. <!-- launchMode 就是启动模式的配置 -->
  11. <activity
  12. android:name=".OneActivity"
  13. android:launchMode="standard">
  14. <intent-filter>
  15. <action android:name="android.intent.action.MAIN" />
  16. <category android:name="android.intent.category.LAUNCHER" />
  17. </intent-filter>
  18. </activity>
  19. <!-- launchMode 就是启动模式的配置 -->
  20. <activity
  21. android:name=".TwoActivity"
  22. android:launchMode="standard"></activity>
  23. </application>
  24. </manifest>
然后我们运行
这是运行后的界面

我接下来进行画图演示
 
 我们可以看出来,标准模式下,我们只要打开一个Activity,在栈中都会创建一个实例,就上图来说,我们点击后退键。
  • 点击第一次,在栈顶的oneActivity就会出栈,展示的就是twoActivity的界面
  • 点击第二次,此时在栈顶的twoActivity就会出栈,展示的就是oneActivity的界面
  • 点击第三次,此时在栈顶的oneActivity就会出栈,展示的就是oneActivity的界面
  • 点击第四次,我们就会回到桌面了
这个就是standard模式下的activity的特点。
接下来我们进行第二种模式。
我们只需要在AndroidManifest中把activity的启动模式更改一下即可
  1. <activity
  2. android:name=".TwoActivity"
  3. android:launchMode="singleTop">
  4. </activity>
画图演示:

 从上图就可以看出,如果是singleTop模式的twoActivity在栈顶,就会直接复用,不再创建实例入栈,如果我们第3步点击第一个按钮,oneActivity就会进栈,这次我们再次点击第二个按钮,twoActivity就会创建实例入栈,因为当前在栈顶的activity是oneActivity。
按照上图的我们按退出键:
  • 第一次点击退出键,在栈顶的twoActivity会出栈,展示的界面是oneActivity
  • 第二次点击退出键,在栈顶的oneActivity就会出栈,展示的界面是oneActivity
  • 第三次点击退出键,在栈顶的oneActivity就会出栈,回到桌面


接下来我们来说一下第三种启动模式singleTask:修改启动模式的代码我就不贴了,直接上图

如上图,这就是singleTask的特点,只要在栈内存在过次Activity的实例,就会将在它之上的实例全部移除,让其自身处在栈顶
此时,我们点击退出键:
  • 第一次点击退出键,twoActivity出栈,展示oneActivity界面
  • 第二次点击退出键,oneActivity出栈,展示oneAcitity界面
  • 第三次点击退出键,回到桌面

第四种模式,singleInstance模式,修改Activity的启动模式,上图

 如图,这种模式就是会新创建一个任务栈用来存放实例
当我们点击后退键的时候,因为我们当前在oneActivity的任务栈,所以我们需要点击3次后退键,才会现在twoActivity,当我们再次点击后退键的时候,会回到桌面。

总结一下
standard:标准模式, 开启一个Activity就进栈,到栈顶,关闭一个Activity就出栈。
singleTop: 当一个Activity需要进栈时,会检测现在栈顶的Activity是否是要进栈的Activity,如果是直接复用,不需要重新创建Activity的实例。不是,则创建Activity的实例并进栈,到栈顶。   应用场景:短信查看界面
singleTask: 当一个Activity需要进栈时,会先检测当前栈内是否有该Activity的实例,如果有直接复用,并将其上方其他Activity实例全部清空。应用场景:浏览器的浏览Activity
SingleInstance: 当一个Activity的启动模式设置成SingleInstance时,该Activity启动时会单独创建一个新的任务栈来保存Activity的实例,其他任务栈和该Activity的任务栈是相互独立的,在该基础上开启其他标准的Activity时,任务栈会切换并创建新的标准任务栈的实例。应用场景:打电话的界面 ,phone应用


0 0
原创粉丝点击