Android Activity四种启动模式

来源:互联网 发布:软件自学网站大全 编辑:程序博客网 时间:2024/06/07 10:18

四种模式

  1. standard:标准模式,默认的加载模式。
  2. singleTop:Task栈顶单例模式。
  3. singleTask:Task内单例模式。
  4. singleInstance:全局单例模式。

Android采用Task来管理多个Activity,启动一个应用,即会创建一个Task。
可以调用Activity的getTaskId()方法来获取它所在的Task的ID。

测试代码:

MainActivity.java

public class MainActivity extends AppCompatActivity {    @BindView(R.id.button)    Button button;    private String TAG = "---MainActivity---";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.bind(this);        Log.i(TAG, "TaskID:" + this.getTaskId());    }    @OnClick(R.id.button)    public void onViewClicked() {        Intent intent = new Intent(this, MainActivity.class);//启动自己           //Intent intent = new Intent(this, OtherActivity.class);//启动另一个Activity        startActivity(intent);    }}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:gravity="center"    tools:context="com.loadmodel.MainActivity">    <Button        android:id="@+id/button"        android:layout_width="200dp"        android:layout_height="wrap_content"        android:text="启动" /></LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.loadmodel">    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:roundIcon="@mipmap/ic_launcher_round"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity            android:name=".MainActivity"            android:launchMode="singleTask">//此处修改加载模式            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity            android:name=".OtherActivity"/>    </application></manifest>

standard模式

这里写图片描述

运行上面的程序,点击按钮。程序会不断启动新的Activity实例,他们的TaskId相同,hashCode不同,表明这种加载模式不会使用新的Task。

这里写图片描述

singleTop模式

这种模式与standard模式基本相同,单有一点不同的是,当要启动的Activity已经位于Task顶时,不会创建新的实例,而是直接复用。
上面的程序如果改为singleTop模式,无论单击多少次,都不会有任何变化。
如果要启动的的activity没有位于Task顶,则会重新创建acticity实例,并加到栈顶,此时与standard模式完全相同。

singleTask模式

OtherActivity.java

public class OtherActivity extends AppCompatActivity {    @BindView(R.id.button)    Button button;    private String TAG = "---MainActivity---";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.bind(this);        Log.i(TAG, "TaskID:" + this.getTaskId() + " hashCode:"+this.hashCode());    }    @OnClick(R.id.button)    public void onViewClicked() {        Intent intent = new Intent(this,MainActivity.class);        startActivity(intent);    }}

修改MainActivity.java:

       //Intent intent = new Intent(this, MainActivity.class);//启动自己    Intent intent = new Intent(this, OtherActivity.class);//启动另一个Activity    startActivity(intent);

在这种加载模式下activity在一个Task只有一个实例,有如下3种情况:

  1. 如果将要启动的Activity不存在,系统会创建目标Activity的实例,并加入栈顶。
  2. 如果该Activity已经位于栈顶,此时与singleTop模式相同。
  3. 如果已经存在但是没有位于栈顶,系统会将该Activity上的所有Activity移出栈顶,是目标Activity转入栈顶。

测试

反复点击两个界面的启动按钮,结果如下:
这里写图片描述

分析

  1. 系统启动Task栈中自底向上Activity有两个实例:MainActivity,OtherActivity。(情况1
  2. 系统程序入口进入MainActivity(情况3
  3. MainActivity跳转到OtherActivity(情况1
  4. OtherActivity跳转到MainActivity(情况3

singleInstance模式

这种加载模式下,物料那个Task中启动目标的Activity,只会创建一个目标的Activity实例。并用一个全新的Task加载该Activity。
加载的Activity总是位于Task栈顶,且所在的Task只包含该Activity。
有如下两种情况:

  1. 如果将要启动的Activity不存在,先创建一个全新的Task,再创建目标Activity的实例,并加入栈顶。
  2. 该Activity已经存在,无论位于那个应用程序中,位于哪个Task中,系统会把该Activity所在的Task转到前台,是该Activity显示。

测试

修改AndroidManifest.xml:

 <activity        android:name=".OtherActivity"        android:exported="true"        android:launchMode="singleInstance">        <intent-filter>            <action android:name="OtherActivity"/>//指定响应的字符串,可以隐式调用            <category android:name="android.intent.category.DEFAULT"/>        </intent-filter>    </activity>

显示调用

反复点击两个界面的启动按钮,结果如下:
这里写图片描述

隐式调用

修改MainActivity.java

       //Intent intent = new Intent(this, MainActivity.class);        //Intent intent = new Intent(this, OtherActivity.class);        Intent intent = new Intent();        intent.setAction("OtherActivity");        startActivity(intent);

分析

  1. 显示调用:MainActivity跳转到OtherActivity(情况1
  2. 隐式调用:MainActivity跳转到OtherActivity(情况2

demo下载地址

http://download.csdn.net/detail/demonliuhui/9825626

0 0
原创粉丝点击