2011-12-14

在 Android 裡區別 standard 與 singleTop 兩種 launchMode 的差別

在 AndroidManefest.xml 裡可以對 activity 設定不同的 launchMode(standard、singleTop、singleTask、singleInstance),預設為 standard,前兩個功能類似,可以歸為比較常用的一組,後兩者歸為比較不常用的一組。

先看看官方文件的說法:
  • standard - The system always creates a new instance of the activity in the target task and routes the intent to it.
  • singleTop - If an instance of the activity already exists at the top of the target task, the system routes the intent to that instance through a call to its onNewIntent() method, rather than creating a new instance of the activity.
白話說,就是 standard 不會 reuse 已有的 instance,而 singleTop 會 reuse 已有的 instance,但條件是該 instance 得在 stack 最上方。

這裡用發送通知做測試兩種的差異,啟動 activity 後立即發送 notification,然後到 notification bar 點選 notification 回到同名的 activity,這時 standard 的 activity 就會另外產生一個新的 instance 在原來的 instance 上,而 singleTop 則會回到原來的 instance,可以從唯一的 key 值做判斷,也可以使用 Back 鍵來測試,standard 的要按兩下才會離開該 activity,事實上是離開兩個 instance,而 singleTop 的只要按一下就離開了。

AndroidManifest.xml
<activity. .. android:launchMode="standard | singleTop">
...
</activity>
SingletonActivity
public class SingletonActivity extends Activity {

    private static final String TAG = "SingletonActivity";
    private NotificationManager nMgr;
    private long key;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        this.nMgr = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);
        this.key = System.currentTimeMillis();
        Log.d(TAG, "onCreate - " + key);

        // 立即發送通知
        String title = "Singleton";
        String msg = "Singleton 測試";
        Notification n = new Notification(R.drawable.ic_launcher, msg,
                System.currentTimeMillis());
        // 回到同名 activity
        PendingIntent pi = PendingIntent.getActivity(this, 1, new Intent(this,
                SingletonActivity.class), 0);
        n.setLatestEventInfo(this, title, msg, pi);
        this.nMgr.notify(1, n);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume - " + key);
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause - " + key);
    }

    @Override
    protected void onDestroy() {
        super.onPause();
        Log.d(TAG, "onDestroy - " + key);
    }
}
standard launchMode - 兩組不同 key 值的 onCreate 與 onDestroy。


singleTop launceMode -僅有一組 key 值的 onCreate 與 onDestroy。

沒有留言:

張貼留言