先看一下standard啟動模式的說明:
隻有一個執行個體,在同一個應用程式中啟動他的時候,若不存在此Activity執行個體,則會在目前棧頂建立一個新的執行個體,若存在,則會把棧中在其上的其它Activity執行個體銷毀掉,并調用此執行個體的OnNewIntent方法,如果實在别的應用執行個體中啟動它,則會建立一個棧,并在該棧中啟動這個Activity,然後我在這個Activity執行個體中再打開新的Activity這個新的執行個體會在一個棧中
我們首先通過一個執行個體了解這句:隻有一個執行個體,在同一個應用程式中啟動他的時候,若不存在此Activity執行個體,則會在目前棧頂建立一個新的執行個體,若存在,則會把棧中在其上的其它Activity執行個體銷毀掉,并調用此執行個體的OnNewIntent方法
首先在手機上的效果

xml布局檔案 兩個按鈕 一個用于打開MainActivity(Activity1),一個用于打開OtherActivity(Activity2)
MainActivity和OtherActivity同時使用這個布局檔案,并為其按鈕添加點選事件
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="46dp"
android:text="Activity1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/button1"
android:layout_marginLeft="48dp"
android:layout_toRightOf="@+id/button1"
android:text="Activity2" />
</RelativeLayout>
MainActivity
package com.example.singletop;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener{
private Button btn_open1,btn_open2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//設定标題為Activity1
setTitle("我是Activity1");
btn_open1=(Button) findViewById(R.id.button1);
btn_open2=(Button) findViewById(R.id.button2);
btn_open1.setOnClickListener(this);
btn_open2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.button1:
startActivity(new Intent(MainActivity.this,MainActivity.class));
break;
case R.id.button2:
startActivity(new Intent(MainActivity.this,OtherActivity.class));
break;
}
}
}
OtherActivity
package com.example.singletop;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class OtherActivity extends Activity implements OnClickListener{
private Button btn_open1,btn_open2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//設定标題為Activity2
setTitle("我是Activity2");
btn_open1=(Button) findViewById(R.id.button1);
btn_open2=(Button) findViewById(R.id.button2);
btn_open1.setOnClickListener(this);
btn_open2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.button1:
startActivity(new Intent(OtherActivity.this,MainActivity.class));
break;
case R.id.button2:
startActivity(new Intent(OtherActivity.this,OtherActivity.class));
break;
}
}
//在此方法中列印是否調用這個方法的日志
@Override
protected void onNewIntent(Intent intent) {
// TODO Auto-generated method stub
super.onNewIntent(intent);
Log.d("OtherActivity", "OnNewIntent");
}
}
至于MainActivity和OtherActivity的差別:
MainActivity是standard啟動模式
OtherActivity是singleTask啟動模式
在AndroidManifest.xml中MainActivity預設就是standard啟動模式
配置一下OtherActivity就好
<activity
android:name="com.example.singletop.OtherActivity"
android:launchMode="singleTask"
></activity>
我們舉個例子。
Activity1->Activity2->Activity1->Activity1->Activity2
在Activity棧中是什麼樣子呢?
為什麼是這樣呢?聰明的你肯定了解了吧?哈哈~
我們仔細分析一下,當我們打開Activity1,棧中隻有(Activity1),當再打開Activity2棧裡面為(Activity2,Activity1),再打開Activity1棧裡面為(Activity1,Activity2,Activity1),再打開Activity1棧裡面仍然是正常的(Activity1,Activity1,Activity2,Activity1),下面是重點了。當我們再打開Activity2時發現棧裡面已經有了Activity2了,根據singleTask模式的說明(隻有一個執行個體,在同一個應用程式中啟動他的時候,若不存在此Activity執行個體,則會在目前棧頂建立一個新的執行個體,若存在,則會把棧中在其上的其它Activity執行個體銷毀掉)
此時會删除棧裡面的(Activity1,Activity1)并且調用onNewIntent方法。我們檢視一下日志檔案