Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android開發者指南(16) —— Activity and Task Design

Android開發者指南(16) —— Activity and Task Design

編輯:Android開發實例

前言

  本章內容為開發者指南(Dev Guide)/Best Practices/UI Guidelines/Activity and Task Design,版本為Android3.1 r1,翻譯來自:"深夜未眠"。

 

原文

         http://developer.android.com/guide/practices/ui_guidelines/activity_task_design.html 

 

Activity and Task設計指導

         這篇文檔主要講述Android應用框架的核心原則。站在高層來說,以用戶為中心來設計良好的交互程序,對於應用設計者或是開發者來說是非常重要的。

         下面用例子來闡述了activities和tasks的一些底層原則和機制 ,例如導航,多任務,activity重用,意圖和activity棧。這篇文檔也著重討論了一些設計決策,針對如何利用好它們去設計你的應用程序UI。

         這篇文檔中的例子均是Android應用程序,包括默認應用程序(比如撥號器)、Google應用程序(比如地圖)。你可以自己在Android模擬器上或是Android手機上去試驗這些例子。如果你使用Android手機試驗時,可能未提供本文檔中的某些例子。

         再看這篇文檔之前,請確保您看過本篇中的Design Tips章節。此篇算做是Application Fundamentals文檔的的一部分(特指Tasks and Back Stack章節),它對於程序員來說覆蓋了整個底層機制。

 

 

Applications, Activities, Activity Stack and Tasks

理解Android系統中的四個基本概念對你是很有幫助的,它們分別是:

* Applications

* Activities

* Activity Stack

* Tasks

 

Applications

         一個Android應用程序其實就是由一個或者多個Activity組成。它們被捆綁在一起並存放進.apk文件中,這就是Android應用程序。Android中有著豐富的應用程序,比如郵件、日歷、地圖定位、文本消息、聯系人、照相機、打電話、音樂播放器,系統設置等應用。

         一般情況下,桌面上都會有Android應用程序快捷圖標,用戶可以選擇某一個圖標來啟動應用程序。

Activities

         Activity是Android應用程序的主要組成部分,activity可以是你自己創建的,當然,還可以是其它應用程序中的activity。它們都是在運行時綁定上的,以便於應用程序擴展其自身的功能,它們一旦組合在一起,就會如同一個應用程序一樣。每個activity都有其獨特的UI、明確的功能,諸如打電話、看照片、聽音樂等。任何一個應用程序都應至少有一個activity。

         當使用Android手機時,用戶在屏幕上一個接一個地滑動或是點擊圖標啟動activity,完全不會注意到底層的行為——他們體驗是無縫的。activity後面有activity,task後面還會有task。

         Activity可以處理特定的數據類型和接受一相關的動作。每個activity都有其各自的生命周期,互不干擾;並且它們都可以被用戶或者系統獨立啟動、運行、暫停、恢復運行、停止、重新開始。正因為這個獨立性,activity可以以不同的方式被其它的activity進行替換。

         比如打電話的應用程序就包含了四個activity:打電話、聯系人列表、查看聯系人、添加聯系人,如下圖:

    

            打電話                          聯系人列表              查看聯系人                  添加聯系人

下面的應用程序同樣也包含了很多activity:

* 郵件 - 查看文件夾、郵件列表、郵件,發送郵件和設置郵件賬號。

* 日歷 - 查看天、星期、月、議程,編輯事件、首選項。

* 照相機 - 運行照相機、查看圖片列表、圖片,編輯圖片,運行錄像機,查看錄像列表和錄像。

* 游戲 - 玩游戲和安裝游戲。

* 地圖 - 查看地圖上的位置,查看朋友的位置以及他們的詳細信息(朋友的位置、狀態、照片)。

Activity是Android應用中最為突出的組件,其余組件分別為:service、content provider、broadcast receiver。更多activities的詳情,參見Application Components

 

Activity Stack

用戶之所以能夠從一個activity轉到下一個activity,是因為Android系統針對activity而設計了一個線性的導航歷史以供用戶追溯訪問,這就是activity棧,也稱為back stack。當用戶啟動了一個新的activity,它就被添加進activity棧,以便按BACK鍵時能夠返回到上一個activity。然而,用戶不能按BACK鍵就直接返回到桌面(除非activity的前一個是桌面才可以)。

         activity棧裡面存放的只能是activity,而視圖、窗體、菜單和對話框則不能。也就是說,如果你可以讓用戶從屏幕A跳轉到屏幕B,當用戶按BACK鍵時,他就應該會回到屏幕A,那屏幕A必須是一個activity。有個例外情況就是,你的應用程序需要利用BACK鍵控制自身的導航,那就要自己重新設定BACK鍵的導航功能。

 

Tasks

任務則是一系列的activity集合,它能使用戶完成既定的操作,而又不用去關心這些activity是哪個應用程序裡面的,除明確指定一個新任務之外(參見“中斷任務”小段),那麼其他activity都屬於當前任務的一部分。再次注意的是,這些activity可是任意應用程序中的其中一個,也就是說不管它們所屬的應用程序是否相同。舉個例子,用戶打開了聯系人的程序,任務隨之也會啟動,他選擇了email地址准備發郵件,這時跳轉到了email activity,之後他要添加附件,需要在畫廊中挑選圖片。這裡面,聯系人,email,圖片畫廊都是不同的應用程序。

當一個activity啟動時,任務也隨之啟動的話,那個activity就是根activity。啟動activity一般有這麼幾種方式,應用程序發射器、桌面快捷方式、最近任務切換器。Android系統內部一旦有任務,那麼按BACK鍵就可以回到上一個activity。Activity棧可以是多個任務的組成部分。

下面是關於任務的例子,以供參考:

* 發送文本消息並含有附件

* 觀看YouTube視頻並以郵件的方式向其他人分享。

中斷任務 ——任務中有一個重要特性就是能使用戶中斷當前正在做的操作(他們的任務)而去執行其它操作,當然他們也可以回到之前的任務上,也就是說支持同時運行多任務並且來回切換它們。

這裡有兩種情況來開始其它任務,並且都可以返回到原先的任務上。

* 打開通知:用戶接收到通知並打開查看它。

* 用戶轉去做其它操作:用戶在桌面啟動。

當然,也有例外的。除了剛才提到的兩種方式,另外還有一種打開新任務的情況,就在其內部開啟一個activity。例如,在郵件中以新任務的方式打開地圖activity或是打開一個浏覽器activity,當按BACK鍵時就又會回到郵件activity中。

 

 

ActivitiesTasks之旅

         下面的例子闡述了應用程序的基本原則,主要有activities,activity棧,回退鍵,任務和意圖;並展示了系統是如何響應用戶請求的,例如用戶開始了一個應用程序,用戶不斷的切換UI,程序內部就是利用在不同任務之間切換activities的。下面的許多例子你都可以在Android手機上運行起來。

在桌面上開始一個Activity

桌面是啟動應用程序的主要地方,比如在桌面上點擊應用程序圖標就能將其打開,用戶第一眼看到的就是應用程序中的主activity。如下圖,所描述的是用戶在桌面點擊Email圖標所發生的事情:

 

BACKHOME鍵進行導航

Activity保持或者丟掉其狀態完全取決於用戶是怎樣離開這個activity的——使用HOME鍵還是BACK鍵。

默認情況下,按下BACK鍵來結束(銷毀)當前activity並為用戶顯示上一個activity。例如下圖,用戶在桌面上打開了郵件,當前activity顯示著郵件列表。用戶將列表滾動條往下拉以便看到後面的郵件,這時用戶按了BACK鍵,那麼Android就會銷毀這個郵件信息列表activity並返回之前的activity(桌面)。然後用戶又重新打開郵件,還是那個列表,但是滾動條又回到了起始位置上。

上面的例子中,當按下BACK鍵就返回到了桌面,由於那是用戶在上一次看到的activity。不過如果用戶從其他activity裡面跳轉到郵件列表,然後按下BACK鍵則回到了先前的那個activity(這裡只是說明一下BACK鍵的作用)。

相比之下,下面的圖就是用HOME鍵離開郵件列表activity而不是BACK鍵,那麼當前activity就呈stop狀態並移置後台而不是銷毀。當再次打開郵件列表activity時狀態保持不變。

其它情況:有些應用程序則不是如上面所說的那樣。例如聯系人和畫廊,用戶在桌面打開聯系人後查看了某個聯系人的資料,接著再次打開聯系人時,就不會顯示之前的activity了。這是因為聯系人的主activity有四個標簽,是為了讓用戶能夠看到全部的功能特性。

此外,也不是所有activity都是當按下BACK鍵之後銷毀掉的。例如用戶開始播放音樂,接著按下BACK鍵,卻不會影響音樂的播放。即使它的activity不再可見,音樂應用程序依然會在狀態欄上提示著用戶。注意:你也可以讓activity不再可見時停止掉或是繼續在後台運行,但後者更適合像音樂這樣的應用程序。

 

重用activity

         有兩個應用程序中,它們分別也有兩個activity:activity A 和activity B。A的部分功能需要調用B的已實現功能,那麼B就叫被重用。

聯系人重用畫廊來獲取圖片 — 聯系人activity中會有聯系人的照片,但是照片一般存放在畫廊裡面,所以聯系人要重用畫廊的功能來獲取圖片,畫廊activity就是重用的絕佳例子。下面的圖畫出了重用的流程。具體流程是這樣的:用戶打開了聯系人,查看某一個聯系人的資料並想編輯他的照片,這時,打開了畫廊activity,對圖片進行設置並保存,那個聯系人的圖片也就相應的改變了。

注意畫廊最終會返回給聯系人一張圖片。 下一個例子講述一個activity的重用並且不返回任何結果。同樣需要注意下面的插圖是說明通過activity或是activity棧來實現歷史導航——用戶可以通過每個activity用任何方式回到桌面。

當開始設計一個應用程序時,一個不錯的想法就是怎樣能夠在重用其它應用程序中的activity或是你的activity怎樣被其它應用程序重用。如果用一樣的intent filter(已經存在了一個activity)再添加一個activity,那麼系統會為用戶顯示出一個選擇UI,供用戶選擇使用那個activity。

        

畫廊重用短信來與其他人分享圖片。分享也是不同應用程序之前重用的好例子。如下圖所示,用戶打開了畫廊,從中挑選了一張圖片並點擊了共享菜單,選擇“短信”。這時,就打開了短信activity,在其裡面寫些文字和附加上那張圖片之後發送出去。用戶現在在短信activity當中,如果想回到畫廊activity,就按BACK鍵返回。

注意這裡的短信activity並沒有給畫廊返回任何的東西。

         這些例子都在闡述任務——一系列的activities都在實現同一個目標。每一個例子中的activity都是從兩個不同的應用程序中完成本職工作的。

替換activity

         這個例子描述的是不用應用程序中的兩個activity互相替換,activity A替換activity B。這種一般發生在activity A比activity B的功能更為強大一些。

         換句話來說,A和B妥妥得等價,當然就可以實現A替換B。這個例子中的聯系人應用程序重用了activity,A和B雖然是完全不同的activity,但是它們兩個彼此形成了互補,使程序更加的強大。

         在這裡例子中,用戶下載了一個手機鈴聲的activity,稱之為“鈴聲擴展”。用戶這時進入到“設置 > 聲音&顯示 > 手機鈴聲”裡面,系統會展示兩個可用activity供用戶選擇。此時彈出的對話有一個選項是讓你設置“是否默認使用此activity”,選中它。當用戶選擇“鈴聲擴”時,以後在加載的時候就替換了Android默認鈴聲的activity了。

 

多任務

如前所述,當一個activity啟動後,用戶還可以回到桌面啟動第二個activity,第一個activity則不會被銷毀還是繼續運行著,我們換個例子來說明這一小節——地圖應用程序。

* 狀態1:用戶打開了地圖應用程序並查詢一個地址。這時,用戶該說了,網絡太TMD慢了!因為地圖定位是需要一些時間的。

* 狀態2:用戶准備做些其它事情,按下HOME鍵,不過這樣做不會干擾地圖應用程序,還是保持其加載地圖的狀態。

* 狀態3:地圖activity現在是在後台運行著,桌面在來到了前台。這時用戶打開了日歷activity,比如查看今天是星期幾。

* 狀態4:用戶回到桌面,重新打開Map,這時地圖已經全部加載完畢了。

         以上兩個應用程序“地圖”和“日歷”是兩個不同的任務,因此Android支持多任務模式。

 

兩個入口點

相對於應用程序來說,必須至少要有一個入口點,也就是至少要有一個activity。桌面上的圖標就代表著每個應用程序的入口點,同樣也可以在其它應用程序中啟動,當然,它們的入口點都在其內部。

         而電話應用程序就有兩個入口點:聯系人和打電話。用戶進入到聯系人裡面選擇了一個電話號碼並撥打該電話。如下圖的圖所示,用戶打開聯系人,也就是啟動了聯系人的activity,然後選擇了一個電話號碼隨之進入了打電話的activity,最後撥打它。

         一旦用戶在應用程序裡,它們就可以通過標簽、菜單項、列表項、屏幕上的按鈕或其他用戶界面訪問諸如新增聯系人和編輯聯系人。

        

 

意圖(Intents)

         用戶點擊一個mailto:的連接時,這實際上就被看作是一個意圖,發郵件的意圖。

         關於意圖有三點要說明:

* 如果是顯式意圖,Android就會立即啟動那個activity。

* 如果是隱式意圖,Android先去intent filter尋找合適的activity再啟動。

* 如果有多個合適的意圖,Android就會列出一個意圖選擇列表供用戶選擇。

下面就舉用戶發郵件的例子,此時用戶的Android上有兩個郵件應用程序,當他在頁面點擊了mailto:鏈接的時候,Android會提示給他一個對話框,其中有兩個可用的程序供其選擇(Gmail和Email)。

下面列舉一些常用的意圖和其對應的activity:

* 查看聯系人列表:對應聯系人列表查看activity

* 查看指定的聯系人:對應聯系人查看activity

* 編輯指定的聯系人:對應聯系人編輯activity

* 發郵件:對應郵件activity

* 撥打電話:對應電話撥打activity

* 查看圖片列表:對應圖片列表查看activity

* 查看指定的圖片:對應圖片查看activity

* 裁剪指定的圖片:對應圖片裁剪activity

意圖必須由兩部分構成:動作和數據。

* 動作:由上面的意圖列表中可得出,查看、編輯、打電話、裁剪

* 數據:由上面的意圖列表中可得出,聯系人的列表、指定的聯系人、電話號碼、圖片列表、指定的圖片。

注意:任何在桌面上啟動的應用程序都是顯式意圖,目的是指定其內部特有的那個activity。同理,應用程序也可以在內部以顯式意圖的方式啟動自身的activity,外部activity都是訪問不到它們的。

關於意圖更多信息,參見Intents and Intent Filters

 

切換任務

下面的例子描述的是用戶如何在兩個任務之間進行切換。

1.         開始第一個任務。你想要發送一條短消息並附加一張圖片。你會這樣操作:

桌面 > 短消息 > 新的短信息 > 菜單 > 附件 > 圖片。最後一步啟動了畫廊activity來選擇一張照片。注意畫廊是另外的一個應用程序。

在選擇照片之前,可以先去桌面打開日歷,目的是為了開始第二個任務。

2.         開始第二個任務。你會這樣操作:桌面 > 查看日歷。從桌面上打開日歷,就等於是開始一個新任務了。

3.         切換到第一個任務並完成後面的操作。

查看完日歷之後,繼續回到先前的任務上:桌面 > 短消息,此時進入的並不是短消息activity,而是畫廊activity,也就是之前離開的activity。然後你就可以選擇圖片並發送短消息出去了,也就完成了第一個任務。

 

 

設計小貼士

         下面的提示和指導都是針對應用設計者和開發者而提出的。

使用顯式意圖來防止外部應用調用你的activity

         如果你不想自己的activity被外部使用,就別在manifest.xml裡面配置intent-filter。這樣的話,你的activity就只會在應用程序內部來啟動了,同樣也避免了安全漏洞。反之,創建一個意圖並指定明確要啟動的組件,這就是顯示意圖,在這個例子中,就不需要intent filters。Intent filters可以發布所有的應用程序,當你創建了一個intent filter時,其它應用程序就可以訪問到你的activity了,至於它們怎麼用,你就不知道了,這意味著不經意間形成了安全隱患。

如果使用外部的activity,但卻沒有匹配上,該怎麼辦?

         有這一種情況,你利用Intent去調用外部應用程序中的activity,但遺憾的是,那個應用程序並沒有安裝進手機裡,因此我們需要妥善的處理這種情況。

(譯者注:官方提出了兩個不太完善的解決方案,我們來看下:)

1.       在啟動那個activity之前用intent先對其測試一下。

2.       如果啟動activity會失敗的話,則捕獲它的異常信息。

以上更多信息請參閱官方文檔提供的博客文章:Can I use this Intent?

         該博文中提供了一種比較好的解決方式,正如其提供的樣例代碼中的isIntentAvailable()方法,我們可以在初始化階段調用它;如果該應用不存在的話,我們就給用戶提示一條消息,告訴他某某應用不存在,請去Google Market下載等友好信息。如果要讓意圖決定顯示哪個activity,那我們就使用startActivity()或是startActivityForResult()來啟動activity。

思考:以怎樣的方式來啟動activity

         做為Android設計者或開發者,完全取決於用戶如何啟動你的應用程序,而應用程序則是由一系列的activity組成,用戶會從Home或是其他應用程序中啟動這些activity。

* 在桌面點icon來啟動應用程序主activity

         如果你的應用程序是獨立運行的,它應該是用戶在屏幕上觸摸應用程序的icon或是任務選擇器當中來啟動(這個機制需要在manifest.xml中配置intent filter,action為MAIN,category為LAUNCHER)。

* 在其它應用程序中啟動你的activity

這種方式就意味著你的activity是可重用的,也就是隱式意圖。許多應用程序中的數據都需要共享給其它用戶的,例如,email、文本消息、上傳下載等。

還會有一種情況是這樣,就是當用戶選擇了一個功能,正好有一個或多個activity符合用戶的這種需求,就會向用戶提供一個activity列表供其選擇。舉一個具體的例子,Gallery(畫廊),它能讓用戶查看並共享圖片,這時用戶選擇了“共享”菜單,Android系統會在intent filter中尋找適合該請求的activity,如果有多個,就會以列表的形式展現給用戶,供其選擇。在這個例子中,intent filter能找到Email、Gmail、Messaging、Picasa等。

當其它的activity啟動了你的activity時,會根據需求給它們返回一個結果。

> 啟動一個activity並需要返回一個結果

         官方稱這種方式為closed loop,也就是說當啟動一個activity之後,會返回一個結果回來。再拿上面那個例子來說,當用戶完成上傳或者發送的過程之後,會將圖片信息返回給Gallery。這個例子中的上傳過程所用到的activity就是由外部的Gallery啟動的。(這種方式需使用startActivityForResult())

> 啟動一個activity不需要返回結果

         官方稱這種方式為open-ended。舉個例子,在Email中可定位一個住址,那麼應用程序便會啟動地圖activity來定位地址,完成之後不會再給Email返回任何的結果;此時用戶可以按BACK鍵回到Email中來。(這種方式需使用startActivity())

* 只從其他應用程序中啟動activity -前面所說的例子,Gmail、消息、Picasa(在Gallery啟動)都是activity,它們均從桌面上的icon來啟動的,與之形成對比的是,像裁剪圖片和添加附件則不是在桌面啟動的,因為這些都不是獨立運行的。

實際上,並非所有的應用程序都有icon以供啟動,它們都算作是一種小小的應用而已,因為它們使用並不頻繁,而且其啟動點都嵌在已有的應用程度當中。例如,Android手機裡面的打電話程序,其內部有個鈴聲設置功能,它存在於Android手機裡面的設置(Setting)菜單裡面,你也可以使用同樣的Intent開發出一個定制的鈴聲設置應用,這樣,在用戶需要改變鈴聲時,會向其展示出兩個鈴聲設置應用,一個是Android內置的,另一個就是你開發出來的。如下圖:

                  

         鈴聲設置並不是經常使用,而且其定義的功能也很明確,所以也就不需要在桌面提供應用程序icon了。

* 不同的圖標能夠啟動多個相同的應用程序 -由於Android應用程序的運行代碼均存在於.apk文件中,因此就把這個文件看作是一個應用程序。我們甚至還可以讓其內部存在兩個主activity,也就是兩個應用程序啟動入口點。

Camera.apk(照相機)就是一個非常好的例子,它內部就含有兩個獨立的主activity,Camera和Camcorder(攝像機);它們均擁有自己的icon並且獨立運行;在用戶角度上來看,這就是兩個應用程序。它們都共享使用一個鏡頭、在Gallery裡面保存圖片等。

實現這樣的功能其實很簡單,只需將它們都關聯到不同的任務上即可。(每個activity都其各自的任務,每個任務都有不同的親緣性(affinity)。(這個例子的兩個應用它們所在的兩個包是"com.android.camera"和"com.android.videocamera",有興趣的可以深入研究)。

聯系人和撥號器也是同一個應用兩個主activity的典型例子。

* 應用程序部件 - 我們也可以將應用程序以部件的形式嵌進桌面上或是其它應用程序中並能它們持續更新。

        

允許你的activity添加到當前任務中

如果你的activity是在外部應用程序已經啟動的話,那麼也允許把它們添加到當前的任務中來(或者是已存在的任務——它有自身的affinity),這樣做的話能會使用戶能夠在其它任務和你的activity之間進行自由切換。但不包括你的activity僅有一個實例的情況。

         對於這種行為,你的activity應該有一個standard 或singleTop的啟動模式,而不是singleTask或singleInstance,這樣,你的activity就會以多實例的模式來運行。

 

通知,應該能讓用戶更容易的返回上一個activity

         利用後台運行的服務能夠給用戶發出他們感興趣的事件消息。下面舉個例子,主要是以Calendar為主,這個例子含兩部分,一個是以Email的形式發出即將來臨的消息,另一個是當有新消息時就發出通知。

我們來模擬一個應用場景,當某個用戶處於activity A中,這時獲取到了activity B發出的通知,他打開了這個通知,也就是進入到了activity B,當用戶按下BACK鍵,他應該回退到activity A。

         下面的具體流程描述了當用戶響應通知時,activity棧是怎樣工作的:

1.         首先,用戶在Calendar中設置了一個開會通知,也就是創建了一個新的事件,並將已寫進Email中的部分信息復制到該事務上。

2.         其它用戶選擇 桌面 > Gmail。

3.         他們打開Gmail,接收到來自Calendar發出的一個開會通知。

4.         接著他們打開了那條通知,進入到Calendar activity中,並查看會議的簡要說明。

5.         這時用戶進入到其裡面查看更為詳細的內容(就是在第一步當中復制的信息)。

6.         當用戶完成查看的操作時,按下了BACK鍵。他們回到了Gmail上,也就是打開通知的那個地方。

         但上面的流程在默認情況下卻不是這樣的。

         通常情況下主要有兩種方式來發出通知:

* 通知專用的activity - 接著上面的應用場景來說,某用戶接受了一條Calendar通知,用戶首先進入Gmail,查看詳細的內容就要進入Calendar activity中;用戶查看完後,按下BACK鍵必須要返回到Gmail activity上。實現此功能的前提是,Calendar activity不能有與Calendar或其它activity同樣的親緣性(affinity),也就是將該親緣性設為空字符串即可。下來解釋一下為什麼這麼做。

那個Calendar activity擁有其默認的任務親緣性(taskAffinity),當按下BACK鍵時(如上述第六步)回到了Calendar,而不是Gmail,這就是上面那樣做的主要原因。特定應用程序中的所有activity都具有相同的任務親緣性,因此Calendar activity的親緣性匹配了Calendar的任務,這個任務是在第一步當中運行起來的,那第四步就表示打開Calendar activity,又回到了Calendar的任務中,所以最後返回的還是Calendar activity。但這不是我們想要的結果,只有將任務親緣性設為空字符串才能解決這個問題。

* 選擇已有的activity,但只會展示其初始的狀態 -例如,用戶在於Gmail交互的過程中進入到了其它Activity,稍後再在回到Gmail activity時顯示要顯示其初始的狀態,而不是先前的狀態。首先,你要確保通知觸發器起作用時,intent的標識是“clear top”,所以當activity啟動時,它顯示的是初始化之後的activity,防止Gmail再次來到前台時還是用戶上一次的看到的那些狀態。(你需要在intent對象中設置FLAG_ACTIVITY_CLEAR_TOP標志)

另外還有其它方式去處理通知,比如讓一個activity到前台並設置好其顯示的指定數據,比如短信息。

一般情況下都是以新任務的形式來啟動通知activity的(也就是說,在intent對象中設置FLAG_ACTIVITY_NEW_TASK),這麼做是避免這個任務成為另一個任務中的一部分。

 

請使用通知系統,而不要使用對話框來代替通知

         如果你的後台服務在某個時刻要通知給用戶一個消息,那麼請使用標准通知系統-,不要使用dialog或toast來通知。這兩個會直接彈出來提示用戶,再說通俗一些就是會突然打斷用戶的當前操作,這是一個極為不友好的用戶體驗。通知系統在這方面就做得就比較好,用戶可以在適當的時候從屏幕上方拉下通知列表以便回應消息。

 

不要重新設置BACK鍵的功能,除非你有絕對的需要

         BACK鍵的主要功能就是從當前的activity回退到上一個activity,就是所謂的導航功能。大多數的activity都是一些比較通用的操作,諸如查看聯系人列表,查看照片等,如果按BACK鍵,就直接返回先前調用它的activity就好了,不需其它的功能需求。

但要考慮一個問題,如果是應用程序非常得大,並需要細粒度的BACK鍵來加以控制該如何呢?例如Google浏覽器,已經打開了幾個web頁面和地圖頁面,其中有一些關於地圖數據的圖層面板,我們需要在它們之間進行切換操作,也就是說在其內部通過BACK鍵來對其進行回退導航,而不是針對整體的activity。

         接上面的例子繼續說,地圖應用程序展現給用戶不同的數據圖層面板:有用來顯示查詢結果的定位信息、有顯示朋友的位置、有顯示街道方向的路線等。地圖應用程序將這些圖層面板保存在自身的歷史記錄裡面,所以需要BACK鍵來進行回退導航。

         同樣地,浏覽器使用浏覽器窗體為用戶展示多個的web頁面,每個窗體都有它自身的歷史導航,也就是桌面操作系統上的浏覽器中的標簽。例如,你在Android浏覽器中的一個窗體上打開Google進行查詢,並點擊一條查詢結果,那麼這個結果頁面會在當前窗體上打開,然後按BACK鍵就會回到了查詢頁面。總結一句話就是,當前窗體是從先前的窗體上跳轉過來的,這時按BACK鍵就會回到了先前的窗體。如果用戶一直按BACK鍵的話,最後就會離開浏覽器所在的activity,回到了桌面。

         這些例子就是你有絕對的需要才要重新設置BACK鍵功能的理由。

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