我是靠谱客的博主 稳重烧鹅,最近开发中收集的这篇文章主要介绍Android Activity四种启动模式,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

四种模式

  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

最后

以上就是稳重烧鹅为你收集整理的Android Activity四种启动模式的全部内容,希望文章能够帮你解决Android Activity四种启动模式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部