<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>
<?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>
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); } }
----------------------------------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(); } }
<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>
<?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" />
public void startSingleTopActivity(View v) { Intent intent = new Intent(this, SingleTopActivity.class); startActivity(intent); }
点击3次“
激活singleTop模式Activity”按钮
点击第二个SingleTop的按钮,就会调用SingleTopActivity中的onNewIntent()方法。
----------------------------------singleTask---------------------------------------------------------------------
android:launchMode="singleTask"