天天看點

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

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

隻有一個執行個體,在同一個應用程式中啟動他的時候,若不存在此Activity執行個體,則會在目前棧頂建立一個新的執行個體,若存在,則會把棧中在其上的其它Activity執行個體銷毀掉,并調用此執行個體的OnNewIntent方法,如果是在别的應用執行個體中啟動它,則會建立一個棧,并在該棧中啟動這個Activity,然後我在這個Activity執行個體中再打開新的Activity這個新的執行個體會在一個棧中

上篇文章我們已經了解這句:隻有一個執行個體,在同一個應用程式中啟動他的時候,若不存在此Activity執行個體,則會在目前棧頂建立一個新的執行個體,若存在,則會把棧中在其上的其它Activity執行個體銷毀掉,并調用此執行個體的OnNewIntent方法

這篇文章我們一個執行個體來了解下半句話:如果是在别的應用執行個體中啟動它,則會建立一個棧,并在該棧中啟動這個Activity,然後我在這個Activity執行個體中再打開新的Activity這個新的執行個體會在一個棧中

在手機上需要安裝兩個程式。其中一個程式(singleTask)的界面是這樣的,Activity2是singleTask的啟動模式

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

另外一個程式(OpenActivity2)的界面是這樣的

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

好了  然後附上代碼

singleTask:

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(Activity1).class

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(Activity2).class

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");
  }
}      

别忘記在AndroidManifest.xml檔案中配置

OtherActivity(Activity2)的資訊

<activity 
            android:name="com.example.singletop.OtherActivity"
            android:launchMode="singleTask"
            >
            <intent-filter>
                <action android:name="android.intent.action.Activity2" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>      

然後是另外一個程式

OpenActivity2:

布局檔案,隻有一個按鈕,用來打開啟動模式為singleTask的Activity2

<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_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="102dp"
        android:text="打開Activity2" />

</RelativeLayout>      

按鈕通過隐式意圖打開Activity2

MainActivity.class

package com.example.openactivity2;

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 {

  private Button btn_open2;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn_open2=(Button) findViewById(R.id.button1);
    btn_open2.setOnClickListener(new OnClickListener() {
      
      @Override
      public void onClick(View arg0) {
        // TODO Auto-generated method stub
        Intent intent=new Intent();
        intent.setAction("android.intent.action.Activity2");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        startActivity(intent);
      }
    });
  }


}      

好了 。

我們進行這樣的操作。

OpenActivity->Activity2->Activity1->Activity1->Activity2

在棧中是什麼情況呢?

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

會建立兩個Activity棧。這是因為當我們打開OpenActivity2時建立一個棧,暫且命名為OpenActivity棧

我們點選了按鈕會打開Activity2,可是因為Activity2是singleTask的啟動模式,Activity2并不會進入openActivity棧中,而會建立一個Activity棧,暫且命名為SingleTask棧。然後再打開Activity1後,openActivity棧(openActivity2),SingleTask棧(Activity1,Activiy2),再次打開Activity1,openActivity棧(openActivity2),SingleTask棧(Activity1,Activity1,Activiy2).如果再次打開Activity2因為Activity2已經存在在SingleTask棧中,是以,會銷毀上面的兩個Activity執行個體(Activity1,Activity1),并且調用OnNewIntent方法.在日志中輸出資訊如下

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

我們需要按兩次傳回鍵 傳回到主界面。

好了,到這裡 singleTask啟動模式就結束了~