天天看點

android:Activity啟動模式之singleTop

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

可以有多個執行個體,但是不允許此Activity的多個執行個體疊加。即,如果此Activity有執行個體在棧頂的時候,啟動這個Activity,不會建立新的執行個體而會調用其OnNewIntent方法,如果不在棧頂則建立新的執行個體

下面我們通過一個執行個體來仔細了解

這是在手機上的效果

android:Activity啟動模式之singleTop

首先是xml布局檔案,共兩個按鈕

<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>      

建立兩個繼承Activity的類,分别為MainActivity和OtherActivity,代碼基本全部相同,都同時使用上面的xml布局檔案

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

至于MainActivity和OtherActivity的差別:

MainActivity是standard啟動模式

OtherActivity是singleTop啟動模式

在AndroidManifest.xml中MainActivity預設就是standard啟動模式

配置一下OtherActivity就好

<activity 
            android:name="com.example.singletop.OtherActivity"
            android:launchMode="singleTop"
            ></activity>      

我們舉幾個例子。

Activity1->Activity2->Activity1->Activity2

我們做完這些 在棧中的情況是

android:Activity啟動模式之singleTop

然後我們看看日志資訊 為空 說明并沒有調用onNewIntent方法,因為我們在建立啟動模式為singleTop的Activity2時Activity2不在棧頂。需要按四次傳回才能傳回到主界面。

2.Activity1->Activity2->Activity2->Activity2

這個時候棧裡面的情況是什麼樣的呢?

android:Activity啟動模式之singleTop

沒錯  就是這樣的 。為什麼呢?因為我們在建立第三個Activity2時,因為Activity2為singleTop的啟動模式,發現此時有在第二個建立的Activity2為棧頂,是以不會建立新的執行個體而會調用其OnNewIntent方法。建立第四個Activity2也是同樣的道理。這時候我們隻需要按兩次傳回鍵就能傳回到主界面。下面看看日志資訊

android:Activity啟動模式之singleTop

看到這裡的小夥伴的你,懂了這種啟動模式了嗎?

在加深一下印象吧~

singleTop啟動模式的說明:

可以有多個執行個體,但是不允許此Activity的多個執行個體疊加。即,如果此Activity有執行個體在棧頂的時候,啟動這個Activity,不會建立新的執行個體而會調用其OnNewIntent方法,如果不在棧頂則建立新的執行個體