Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中launchMode模式詳解

Android中launchMode模式詳解

編輯:關於Android編程

關於Android中launchMode的文章介紹的真心不少,廣為流傳而且介紹的最詳細的莫過於這篇文章http://blog.csdn.net/android_tutor/article/details/6310015。但是這篇文章中關於singletask和singleinstance在評論中還是有些不解和爭論,在此根據實例重點說下這兩種模式:

實例簡介:有兩個Activity,分別為AActivity和BActivity,界面相同。點擊按鈕A和B,分別啟動AActivity和BActivity,觀察效果:

\

上代碼:

layout_task.xml<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjxicj4KPC9wPgo8cD48L3A+CjxwcmUgY2xhc3M9"brush:java;">
AActivity.java

package com.example.activitytask;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class AActivity extends Activity{
	
	private static final String TMG = "ActivityTask";
	private static int mIndex = 0;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout_task)  ;
		mIndex++  ;
		Log.i(TMG,"AActivity Create"+mIndex+"  TaskId="+getTaskId())  ;
		Button _buttonStartA = (Button)findViewById(R.id.buttonStartA)  ;
		_buttonStartA.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent _intent = new Intent(AActivity.this,AActivity.class)  ;
				startActivity(_intent) ;
			}
		}) ;
		
		
		Button _buttonStartB = (Button)findViewById(R.id.buttonStartB)  ;
		_buttonStartB.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent _intent = new Intent(AActivity.this,BActivity.class)  ;
				startActivity(_intent) ;
			}
		}) ;
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		Log.i(TMG,"AActivity Destory"+mIndex+"  TaskId="+getTaskId())  ;
		mIndex--;
	}
	
	@Override
	protected void onNewIntent(Intent intent) {
		super.onNewIntent(intent);
		Log.i(TMG,"AActivity onNewIntent"+mIndex+"  TaskId="+getTaskId())  ;
	}

}

BActivity.java

package com.example.activitytask;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class BActivity extends Activity{

	private static final String TMG = "ActivityTask";
	private static int mIndex = 0 ;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout_task)  ;
		mIndex++  ;
		Log.i(TMG,"BActivity Create"+mIndex+"  TaskId="+getTaskId())  ;
		Button _buttonStartA = (Button)findViewById(R.id.buttonStartA)  ;
		_buttonStartA.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent _intent = new Intent(BActivity.this,AActivity.class)  ;
				startActivity(_intent) ;
			}
		}) ;
		
		
		Button _buttonStartB = (Button)findViewById(R.id.buttonStartB)  ;
		_buttonStartB.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent _intent = new Intent(BActivity.this,BActivity.class)  ;
				startActivity(_intent) ;
				
			}
		}) ;
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		Log.i(TMG,"BActivity Destory"+mIndex+"  TaskId="+getTaskId())  ;
		mIndex--;
	}
	
	@Override
	protected void onNewIntent(Intent intent) {
		super.onNewIntent(intent);
		Log.i(TMG,"BActivity onNewIntent"+mIndex+"  TaskId="+getTaskId())  ;
	}

}

1.設置兩個Activity的android:launchMode="singleTask"




    

    
        
            
                
                
            
        
        
    


程序剛啟動時的打印結果

\

點擊startB按鈕打印效果

\

進入BActivity界面後,這時再點擊startA按鈕打印結果(先清屏)

\


這時我們發現BActivity銷毀,此時再點擊startB,BActivity重新創建

\

總結:當一個Activity被設置為singletask時

(1)它並沒有創建新的任務棧(根據上面打印效果展示,AActivity和BActivity的TaskId都等於76)

(2)如果它已經存在於棧中,再次請求觸發此Activity時,會調用此類實例的onNewIntent方法,不會重新創建新的實例

(3)如果此類所在的任務棧上面有其它Activity,那麼其它的Activity會被銷毀


2.設置兩個Activity的android:launchMode="singleInstance"




    

    
        
            
                
                
            
        
        
    


程序剛啟動時的打印結果

\

點擊startB按鈕打印效果

\

進入BActivity界面後,這時再點擊startA按鈕打印結果(先清屏)

\

再點擊startB按鈕打印結果(先清屏)


總結:當一個Activity被設置為singleinstance時

(1)如果此Activity沒有實例,它會創建一個新的任務棧。(TaskId一個81,一個82)

(2)如果任務棧中已經有此實例,會調用onNewIntent方法,不會創建新的任務棧和實例

(3)獨立成Taskstack ,並且有且僅有你自己 ,孤家寡人 。而且始終保持一個實例離棧的時候 , 先退當前的task ,再退另外的task

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved