概述
四种模式
- standard:标准模式,默认的加载模式。
- singleTop:Task栈顶单例模式。
- singleTask:Task内单例模式。
- 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种情况:
- 如果将要启动的Activity不存在,系统会创建目标Activity的实例,并加入栈顶。
- 如果该Activity已经位于栈顶,此时与singleTop模式相同。
- 如果已经存在但是没有位于栈顶,系统会将该Activity上的所有Activity移出栈顶,是目标Activity转入栈顶。
测试
反复点击两个界面的启动按钮,结果如下:
分析
- 系统启动Task栈中自底向上Activity有两个实例:MainActivity,OtherActivity。(情况1)
- 系统程序入口进入MainActivity(情况3)
- MainActivity跳转到OtherActivity(情况1)
- OtherActivity跳转到MainActivity(情况3)
singleInstance模式
这种加载模式下,物料那个Task中启动目标的Activity,只会创建一个目标的Activity实例。并用一个全新的Task加载该Activity。
加载的Activity总是位于Task栈顶,且所在的Task只包含该Activity。
有如下两种情况:
- 如果将要启动的Activity不存在,先创建一个全新的Task,再创建目标Activity的实例,并加入栈顶。
- 该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);
分析
- 显示调用:MainActivity跳转到OtherActivity(情况1)
- 隐式调用:MainActivity跳转到OtherActivity(情况2)
demo下载地址
http://download.csdn.net/detail/demonliuhui/9825626
最后
以上就是稳重烧鹅为你收集整理的Android Activity四种启动模式的全部内容,希望文章能够帮你解决Android Activity四种启动模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复