Activity的四种launchMode(详细)_文档下载http://www.wendangxiazai.com/b-73d04d785ef7ba0d4a733bdf.html
Activity的四种launchMode(详细)_文档下载http://www.wendangxiazai.com/b-73d04d785ef7ba0d4a733bdf.html
Activity有以下四种加载模式(实际项目开发中用的不多,多用Fragment):
why:我们在开发项目的过程中,会涉及到该应用中多个Activity组件之间的跳转,或者夹带其它应用的可复用的Activity。例如我们可能希望跳转到原来某个Activity实例,而不是产生大量重复的 Activity。这样就需要我们为 Activity 配置特定的加载模式,而不是使用默认的加载模式。
[1] standard 模式(默认-标准模式)
自己可以启动自己(会创新一个新的Activity)
默认模式,不需要配置launchMode,每次激活Activity时都会创建Activity实例,并放入任务栈中。
[2] singleTop 模式(顶单例模式)
自己不能启动自己
如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。
[3] singleTask 模式(内单例模式)
如果要启动的Activity存在,则干掉要启动的Activity上面的所有的Activity
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
[4] singleInstance 模式(全局单例模式)
在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。
设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性(如图):
话不多说,直接上代码查看演示
效果图(主要看下图划线部分是否变化):
layout
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"
tools:context="com.zking.android13_activity.MainActivity"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="这是MainActivity"
android:textSize="30sp"
android:background="#00ff00"/><!--为了看效果的TextView-->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_main_text"
android:textSize="25sp"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="(当前为A页面)跳自己"
android:onClick="jumpMain"/><!--跳转(跳自己 即A跳A)-->
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳B页面"
android:onClick="jumpB"/>
</LinearLayout>
activity_b.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"
tools:context="com.zking.android13_activity.BActivity"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="这是BActivity"
android:textSize="30sp"
android:background="#00ffff"/><!--为了看效果的TextView-->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:id="@+id/tv_b_text"/><!--文本框-->
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="跳Main(A页面)"
android:onClick="jumpMain"/>
</LinearLayout>
Java
MainActivity.java
package com.zking.android13_activity; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; /** * A页面 */ public class MainActivity extends AppCompatActivity { private TextView tv_main_text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_main_text = (TextView) findViewById(R.id.tv_main_text); //查看当前Activity在内存里的地址 //拿到当前任务栈的id,id一样代表一个栈 tv_main_text.setText("当前Activity实例:"+this+"\n当前任务栈在:"+this.getTaskId()); } public void jumpMain(View view){//跳自己 Intent intent=new Intent(this,MainActivity.class); startActivity(intent); } public void jumpB(View view){//A跳B Intent intent=new Intent(this,BActivity.class); startActivity(intent); } }
BActivity.java
package com.zking.android13_activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class BActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
TextView tv_b_text = (TextView) findViewById(R.id.tv_b_text);
//打印B在内存当中的地址
tv_b_text.setText("当前Activity地址:"+this+"\nB的任务栈在:"+this.getTaskId());
}
public void jumpMain(View view){//跳A页面
Intent intent=new Intent(this,MainActivity.class);
startActivity(intent);
}
}
查看一个效果图:
: