<activity android:name=".MainActivity" android:launchMode="standard" />
standard:
这时默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。
singleTop:
如果在任务的栈顶正好存在该Activity的实例,就重用该实例(会调用实例的onNewIntent()),否则就会创建新的实例并放入栈顶(注:即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建实例)。
这里普及一下数据结构的知识:
栈是一种特殊的线性表,是一种只允许在表的一端进行插入或删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶。表的另一端称为栈底。栈顶的当前位置是动态的,对栈顶当前位置的标记称为栈顶指针。当栈中没有数据元素时,称之为空栈。栈的插入操作通常称为进栈或入栈,栈的删除操作通常称为退栈或出栈。
singleTask:
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent()),重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
singleInstance:
在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity的实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例(会调用实例的onNewIntent()),其效果相当于多个应用共享一个应用,不管谁激活该Activity都会进入同一个应用中。
----------------------------------standard---------------------------------------------------------------------
新建一个项目LaunchMode,在该项目的AndroidManifest.xml文件中的MainActivity配置
android:launchMode="standard"
activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<TextView
android:id="@+id/tv_standard"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="startActivity"
android:text="@string/start_activity" />
</LinearLayout>
strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">启动模式</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="start_activity">激活standard模式Activity</string>
</resources>
MainActivity.java:
package cn.leigo.launchmode;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView mStandardTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mStandardTextView = (TextView) findViewById(R.id.tv_standard);
mStandardTextView.setText(this.toString());
}
public void startActivity(View v) {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
}
}
运行点击3次按钮:
----------------------------------singleTop---------------------------------------------------------------------
android:launchMode="singleTop"
创建一个新的Activity,SingleTopActivity.java
package cn.leigo.launchmode;
import java.util.Date;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class SingleTopActivity extends Activity {
private TextView mSingleTopTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_single_top);
mSingleTopTextView = (TextView) findViewById(R.id.tv_singleTop);
mSingleTopTextView.setText(this.toString());
}
public void startSingleTopActivity(View v) {
Intent intent = new Intent(this, SingleTopActivity.class);
startActivity(intent);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Toast.makeText(this, new Date().toLocaleString(), Toast.LENGTH_SHORT)
.show();
}
}
activity_single_top.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<TextView
android:id="@+id/tv_singleTop"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="startSingleTopActivity"
android:text="@string/start_singleTop_activity" />
</LinearLayout>
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">启动模式</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="start_activity">激活standard模式Activity</string>
<string name="start_singleTop_activity">激活singleTop模式Activity</string>
<string name="single_top">singleTop模式Activity</string>
</resources>
为activity_main.xml添加一个按钮:
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="startSingleTopActivity"
android:text="@string/start_singleTop_activity" />
MainActivity,java:
public void startSingleTopActivity(View v) {
Intent intent = new Intent(this, SingleTopActivity.class);
startActivity(intent);
}
点击3次“
激活singleTop模式Activity
”按钮
点击第二个SingleTop的按钮,就会调用SingleTopActivity中的onNewIntent()方法。
----------------------------------singleTask---------------------------------------------------------------------
android:launchMode="singleTask"