Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> android:Activity啟動模式之singleTask(一)

android:Activity啟動模式之singleTask(一)

編輯:關於android開發

android:Activity啟動模式之singleTask(一)


先看一下standard啟動模式的說明:

只有一個實例,在同一個應用程序中啟動他的時候,若不存在此Activity實例,則會在當前棧頂創建一個新的實例,若存在,則會把棧中在其上的其它Activity實例銷毀掉,並調用此實例的OnNewIntent方法,如果實在別的應用實例中啟動它,則會新建一個棧,並在該棧中啟動這個Activity,然後我在這個Activity實例中再打開新的Activity這個新的實例會在一個棧中

我們首先通過一個實例理解這句:只有一個實例,在同一個應用程序中啟動他的時候,若不存在此Activity實例,則會在當前棧頂創建一個新的實例,若存在,則會把棧中在其上的其它Activity實例銷毀掉,並調用此實例的OnNewIntent方法

首先在手機上的效果

\

xml布局文件 兩個按鈕 一個用於打開MainActivity(Activity1),一個用於打開OtherActivity(Activity2)

MainActivity和OtherActivity同時使用這個布局文件,並為其按鈕添加點擊事件

 

 

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:launchmode="singleTask" android:name="com.example.singletop.OtherActivity"></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方法。我們查看一下日志文件

\

的確調用了一次OnNewIntent方法。只需要按兩次返回鍵就能返回到主界面了。

聰明的你理解了吧?至於下半句的分析請看下篇文章

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