android之Task和Back Stack(回退棧)

來源:互聯網
上載者:User

標籤: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彈出回退棧。

  1.          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(回退棧)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.