標籤:android task back stack(回退棧) back stack 回退棧
通常一個應用程式套件組合括多個Activity,我們在使用程式是,一個Activity到另一個Activity,又到別的Activity,然後我們按下返回鍵又能按開啟的順序,倒敘返回。android中是怎麼做到的?Task和Back Stack與此密不可分。
Task儲存了一組頁面的集合,並且這個集合會被排列到一個叫Back Stack中,儲存的目的在於記錄Activity的開啟順序。
特點:系統會給每個程式分配唯一的Task和回退棧。
回退棧的特點:先進後出。
改變Activity的排序方式:是通過修改主設定檔中的activity標籤,增加android:launchmode屬性。此屬性的取值有四個,分別為standard,singleTop,singleTask, singleInstance。
1、 standard:這個是預設情況。
2、 singleTop:若此activity,activity之間的跳轉(不是從此activity又跳轉到此activity)和預設情況一樣;從此activity又跳轉到此activity,不會建立新的此activity,也就是會這個activity不會重新開啟。它在啟動時,會判斷設定了singleTop屬性的頁面是否位於回退棧的棧頂,如果是,不開啟新頁面,選用之前的頁面,如果不是,開啟新的。
3、 singleTask:當從activity1開啟新activity2的時候,會在回退棧中建立新activity2對象加入棧中,當重新啟動activity1時,會去判斷之前的回退棧中是否儲存了activity1的對象,如果有,那麼將activity1之上所有activity彈出回退棧。
4、singleInstance:設定了此啟動模式的activity會在此activity開啟的時候給他 建立一個單獨的task,那麼每次啟動此頁面的時候,都會去這個單獨的task中拿此對象。是單一實例的。在一個新棧中建立該Activity執行個體,並讓多個應用共用該Activity執行個體。一旦這種模式的Activity執行個體存在於某個棧中,任何應用再啟用這個Activity時都會重用該棧中的執行個體,其效果相當於多個應用程式共用一個應用,不管誰啟用該Activity都會進入同一個應用中。此啟動模式和我們使用的瀏覽器工作原理類似,在多個程式中訪問瀏覽器時,如果當前瀏覽器沒有開啟,則開啟瀏覽器,否則會在當前開啟的瀏覽器中訪問。此模式會節省大量的系統資源,因為他能保證要請求的Activity對象在當前的棧中只存在一個。"launchMode"設定為"singleInstance"的Activity總是在棧底, 只能被執行個體化一次, 不允許其它的Activity壓入"singleInstance"的Activity所在Task棧, 即整個Task棧中只能有這麼一個Activity。
個人認為這裡比較難理解,可以使用安卓程式輔助理解。
樣本如下:
建立一個Android項目:有兩個Activity,有兩個布局檔案
MainActivity.java
import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;public class MainActivity extends Activity{@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setTitle("MainActivity");setContentView(R.layout.activity_main);}public void onClick(View v){switch (v.getId()){case R.id.button1:Intent intent = new Intent(this, MainActivity.class);startActivity(intent);break;case R.id.button2:Intent intent2 = new Intent(this, TwoActivity.class);startActivity(intent2);break;}}}
TwoActivity.java
import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;public class TwoActivity extends Activity{@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setTitle("TwoActivity");setContentView(R.layout.two);}public void onClick(View v){switch (v.getId()){case R.id.button1:Intent intent = new Intent(this, TwoActivity.class);startActivity(intent);break;case R.id.button2:Intent intent2 = new Intent(this, MainActivity.class);startActivity(intent2);break;}}}
activity_main.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_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="104dp" android:onClick="onClick" android:text="@string/ziji" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/button1" android:layout_below="@+id/button1" android:layout_marginTop="61dp" android:onClick="onClick" android:text="@string/other" /> </RelativeLayout>
two.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="104dp" android:onClick="onClick" android:text="@string/ziji" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/button1" android:layout_below="@+id/button1" android:layout_marginTop="61dp" android:onClick="onClick" android:text="@string/one" /></RelativeLayout>
strings.xml中添加如下代碼:
<string name="other">去二頁面</string> <string name="one">去一頁面</string> <string name="ziji">開啟自己</string>
AndroidManifest.xml修改成下列代碼:
<activity android:name="com.zzh.day06_task.MainActivity" android:label="@string/app_name" android:launchMode="singleTask" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.zzh.day06_task.TwoActivity"></activity>
AndroidManifest.xml中不斷修改android:launchMode="singleTask"的取值,查看效果,輔助理解。
本文出自 “JDK7環境的搭建” 部落格,請務必保留此出處http://zzhhz.blog.51cto.com/7107920/1626550
android之Task和Back Stack(回退棧)