<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                上一回說到,用戶選擇是否升級,若用戶選擇不升級,那么就要進入程序的主界面。下面要做的是從splash界面跳轉到main界面。 ### MainActivity創建 1.首先新建MainActivity: ~~~ package com.liuhao.mobilesafe.ui; import com.liuhao.mobilesafe.R; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Set the activity content from a layout resource. The resource will be inflated, adding all top-level views to the activity setContentView(R.layout.main); } } ~~~ 2.MainActivity對應的布局文件: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=".SplashActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout> ~~~ 3.AndroidManifest.xml中配置MainActivity ~~~ <activity android:name="com.liuhao.mobilesafe.ui.MainActivity" android:label="@string/main_screen"> </activity> ~~~ 至此便完成了MainActivity的創建,下面就是SplashActivity到MainActivity的切換。 ### SplashActivity到MainActivity的切換 在SplashActivity新建loadMainUI()方法 ~~~ private void loadMainUI(){ Intent intent = new Intent(this, MainActivity.class); startActivity(intent); finish(); //將當前Activity從任務棧中移除 } ~~~ 然后在之前需要進入主界面的地方調用此方法即可: ① ~~~ if(versiontext.equals(version)){ Log.i(TAG, "版本號相同,無需升級,進入到主界面"); loadMainUI(); return false; } ~~~ ②??????? ~~~ catch (Exception e) { e.printStackTrace(); /** * Toast使用場景 * 1、需要提示用戶,但又不需要用戶點擊“確定”或者“取消”按鈕。 * 2、不影響現有Activity運行的簡單提示。 */ Toast.makeText(this, "獲取更新信息異常", 2).show();//彈出文本,并保持2秒 Log.i(TAG, "獲取更新信息異常,進入到主界面"); loadMainUI(); return false; } ~~~ ③?????? ~~~ builder.setNegativeButton("取消", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Log.i(TAG, "用戶取消升級,進入程序主界面"); loadMainUI(); } }); ~~~ ### 知識點 #### 任務棧TaskStack和Activity的管理 上面的這段代碼就是在一個activity里通過Intent啟動另一個activity的實例。就像前面提到的,一個activity可以啟動另一個,包括那些定義在不同應用程序中的。 一個activity就是一個用戶界面,可以連續啟動很多activity以提高用戶體驗。當然這個數量是有限的,這要根據手機的硬件配置來決定。上一篇文章中已經介紹,所有打開的activity都是存儲在棧中的,所以如果打開的activity過多,會消占去很多的內存和處理器資源,嚴重時會導致當前應用無法啟動或者系統崩潰。 activity是和任務緊密聯系的。因為在android系統中,為了保持用戶體驗,用戶想做某件事情是以任務的結構作為邏輯,以應用的形式來表現的。而一個應用又可以包含很多的activity,所以就涉及到activity和task的關系問題。 #### activity簡單解釋 Android中,Activity是所有程序的根本,所有程序的流程都運行在Activity之中。簡單的的說,任務就是用戶所體驗到的“應用程序”。它是一組相關的activity,分配到 一個棧中。棧中的根activity,是任務的開始——一般來說,它是用戶組應用程序加載器中選擇的activity。在棧頂的activity正是當前 正在運行的——集中處理用戶動作的那個。當一個activity啟動了另外一個,這個新的activity將壓入棧中,它將成為正在運行中的 activity。前一個activity保留在棧中。當用戶按下后退按鍵,當前的這個activity將中棧中彈出,而前面的那個activity恢復 成運行中狀態。 #### activity的生命周期: Activity具有自己的生命周期,由系統控制生命周期,程序無法改變,但可以用**onSaveInstanceState**保存其狀態。對于Activity,關鍵是其**生命周期**的把握(如下圖),其次就是狀態的保存和恢復(onSaveInstanceState onRestoreInstanceState),以及Activity之間的跳轉和數據傳輸(**intent**)。 **onCreate()**------->**onStart**()-------->**onResume**()--------->**onSaveInstanceState**()----->**onPause**()------->**onStop()**--------->**onDestroy**(). ![](https://box.kancloud.cn/2016-02-18_56c5a95330ed8.png) Activity中常用的函數有**SetContentView()?? findViewById()??? finish()?? startActivity(),**其生命周期涉及的函數有: > **`void onCreate(Bundle *savedInstanceState*)` `void onStart()` `void onRestart()` `void onResume()` `void onPause()` `void onStop()` `void onDestroy()`** `注意的是,Activity的使用需要在Manifest文件中添加相應的<Activity>,并設置其屬性和intent-filter。` #### activity的各種狀態的轉換: 當啟動一個activity時,首先是在onCreate處進行初始化界面所需要的信息,如:界面的views,buttons,分配的引用變量等;初始化完成后就會調用onStart,此時就可以看到界面了;當用戶與界面進行交互時就會調用onResume函數;當此activity因為被其他activity沒有完全覆蓋而進入pause狀態時就調用 onPause,當被其他activity完全覆蓋時就調用onStop函數。在后面的這兩種情況下都會調用onSaveInstanceState 方法來暫時保存被覆蓋的activity的狀態,在這些被覆蓋的activity重新回到界面上的時候會恢復這些狀態;當調用finish方法使,這個 activity就被destroy了,也就從棧中移除了。 一個手機應用程序通常包含多個Activities。每個Activity的設計,都是為了完成某種明確的功能及跳轉到其他應用程序的Activity。比如,一個郵件收發應用程序,有一個Title的列表Activity,當點擊列表標題時,跳轉到另外一個Activity去顯示郵件內容。 一個Activity中,也可以去打開另外一個在同一設備上的其他應用程序的Activity。比如,當你發送郵件時,你發出一個發送郵件的意圖Intent,這個Intent包含了郵件地址,郵件消息。另外一個發送郵件應用程序定義了接收這個意圖Intent的處理方式,那么就可以打開發送郵件的應用程序進行郵件發送了。如果多個應用程序支持處理這個意圖Intent,那么系統會提示選擇其中一個執行。當你發送完成之后,就會回到你自己的應用程序,這樣看起來就好比郵件發送應用程序是你自己應用程序中的一部分。不管怎么樣,畢竟是不同應用程序的Activities,是Android系統的Task讓用戶感知完全不一樣了。 Task是一個Activities的收集器,專門收集用戶操作交互所打開的Activity。這些Activities都被安排在一個回收棧back stack中,安排的順序和它們打開的順序一致。即先打開的安排在最底部,最后一個打開的安排在頂部。 設備的主屏幕就是為了放置更多的任務。當用戶點擊某個應用程序圖標打開一個應用時,那么這個任務就處于前端。如果這個應用程序之前未被打開過,就會創建一個新的任務Task。 當當前的Activity打開其他Activities時,新打開的Activity處于back stack的最頂端并處于用戶獲取焦點狀態,當前的Activity被保存置于stack中,處于stopped狀態。當用戶點擊BACK鍵時,stack最頂部的Activity被銷毀,前一個Activity被恢復。Back stack的操作遵循“后進先出”的原則。 ![Android 開發指南(一) 任務Task及回收棧back stack介紹 - Android 魚 - Android 魚](https://box.kancloud.cn/2016-02-18_56c5a9534dd16.jpg) 如果用戶繼續按返回,那么在棧中所有的activity都會被彈出,直到用戶返回到主屏幕(或者到該任務開始的地方)。當所有的activity都從棧中移除后,任務就不復存在了。 一個Task任務是一個完整的單元,它可以運行于后臺。當用戶開啟一個新的任務Task,或者通過HOME鍵跳到主屏幕時,這個任務就處于后臺運行,不過這個Task包含所有的Activities都處于Stopped狀態。但back stack維護者這個任務的完整數據,只是簡單的被其他task替換焦點而已。 ![](https://box.kancloud.cn/2015-12-01_565da699b8109.jpg) 圖2.兩個任務:任務B到了前臺,任務A于是被打入后臺,伺機恢復. 舉個例子,有三個activity在當前任務(任務A)的棧中--其中兩個在當前activity的下面。這時,用戶按下Home鍵回到主屏幕,然后啟動了一個新的應用。當顯示主屏幕時,任務A進入后臺。當新應用啟動時,系統為該應用啟動了一個新任務(任務B)。當用戶與該應用交互完畢之后,重新回到主界面并且選擇任務A的應用。這時,任務A回到前臺--棧中的三個activity都原封未動并且恢復在棧頂的activity。在這個時候,用戶依然可以Home鍵返回主屏幕,選擇任務B的應用圖標來切換到任務B(也可以通過最近使用應用列表啟動)。這就是android多任務的一個例子。 注:在后臺可以同時存在多個任務。但是,如果用戶在運行多個后臺任務,系統可能會銷毀后臺activity來回收內存,導致activity的狀態丟失。關于這方面內容后面小節講述。 因為在回退棧中的activity從來不會被重排,如果你的應用允許用戶從多個activity啟動一個特定的activity,那么會新創建該activity的一個實例并且把它放到放到棧頂。因此,在你的應用中一個activity可能被實例化多次,如下圖所示。因此,用戶使用回退鍵返回,那么每個activity的實例會按照被打開的反向順序被顯示。但是,如果你不想把一個activity實例化多次,你可以修改這種行為。關于如何修改,我們稍后會在“任務管理”一節中討論。 ![](https://box.kancloud.cn/2015-12-01_565da69aa2484.jpg) 圖3.一個activity被實例化多次. 讓我們來總結一下activity和任務的默認行為: - 當Activity A啟動Activity B,Activity A會停止,但是系統會保存Activity A的狀態(例如滾動條位置,編輯框中的文字等)。如果在Activity B時,玩家按返回鍵,會使用保存的狀態恢復Activity A。 - 當用戶按下Home鍵離開一個任務,當前的Activity會被停止并且當前任務會進入后臺。系統保存該任務中所有Activity的狀態。如果用戶通過啟動圖標再次啟動該任務,該任務會回到前臺并且恢復棧頂端的Activity。 - 如果用戶按下回退鍵,當前的Activity會從棧中彈出并且銷毀。棧中的前一個Activity被恢復。當一個Activity被銷毀時,系統不會保存該Activity的狀態。 - Activity會被實例化多次,即使是由其他任務啟動的。 #### 保存Activity的狀態 如前一節所述,系統默認下會在activity停止的時候保存其狀態。如此一來,當用戶導航到前一個activity時,其用戶介面顯示得跟離開時一樣。然后,你可以—并且應該—提前使用你的activity的回調方法們保持它的狀態,因為activity可能會被銷毀然后被重新創建。當系統停止了你的一個activitie(比如當新的activity啟動或任務被移到后臺),系統可能為了釋放內存會完全銷毀那個activity。當這種情況發生時,activity的狀態就會丟失。如果真發生了這種現象,系統依然知道那個activity在后退棧中占有一個位置,但是當activity被弄到前臺時,系統必須重新創建它(而不是僅僅恢復它)。為了避免丟掉用戶的工作,你應該通過實現activity的onSaveInstanceState() 來提前保存狀態. #### 如何進行任務管理 剛才說明的那些行為,是activity和任務的默認行為。Android管理任務和后退棧的方式,如前面文章所述是通過把所有接連啟動的 activity放在同一個任務中并且是同一個后進先出的棧中完成的。你不必要去擔心你的Activites如何與Task任務進行交互,它們是如何存在于back stack中。但是,你也許想改變這種正常的管理方式。比如,你希望你的某個Activity在一個新的任務中進行管理,或者你只想對某個Activity實例化,又或者你想在用戶離開任務時清理Task中的所有Activities,除了根Activity。 要完成這些特殊的管理方式,activity和任務的關聯,activity在任務中的行為,受控于啟動activity的行為對象的標志位和清單文件中的[<activity>](http://developer.android.com/guide/topics/manifest/activity-element.html) 元素的屬性的互相作用。 1. 在manifest文件中,對接收請求(即Intent對象)的activity組件設置一些屬性。 1. 在發送的請求(即Intent對象)中設置一些標記。 所以在請求者和接收者中都可以進行控制。 Activity在manifest可配置的屬性有: - taskAffinity - launchMode - allowTaskReparenting - clearTaskOnLaunch - alwaysRetainTaskState - finishOnTaskLaunch Intents 標識有: - FLAG_ACTIVITY_NEW_TASK - FLAG_ACTIVITY_CLEAR_TOP - FLAG_ACTIVITY_SINGLE_TOP 注意:大多數應用不應改變activity和任務的默認行為。如果你確定必須要改變默認行為,你必需小心并且保證測試了activity在啟動時和后退導航到它時的可用性。確保測試了與用戶習慣相沖突的導航行為。 #### 定義啟動模式 你可以通過定義運行模式來定義Activities如何與Task進行交互。定義的兩種方式如下: 1.使用manifest文件 當你在你的manifest文件中聲明一個activity時,你可以指定activity在啟動時如何與任務相關聯. 2.使用Intent的flag 當你調用startActivity()時,你可以在Intent中包含指明新的activity如何(或是否)與當前棧關聯的flag. 例子:Activity A 啟動 Activity B。如果B在manifest中定義了運行模式,并且A在啟動B時,也在Intent中指定了B的運行模式,那么A在Intent的定義將覆蓋B在manifest中的定義。 注:有些運行模式在manifest中定義有效未必在Intent中也有效,同樣,在Intent定義有效的運行模式在manifest中未必生效。 ##### 如何使用manifest配置管理 在manifest配置文件中,你可以通過<activity>元素的的**launchMode**屬性來指定4中不同的運行模式,指定activity如何與一個任務關聯。launchMode屬性指明了activity如何啟動到一個任務中去。有四種不同的啟動模式你可以用于指定給launchMode屬性: 1. Standard:標準默認模式 > 在這種默認模式下,Activity可以被多次實例化,也可以運行在多個Task中,一個Task可以擁有多個Activity實例。activity可以被多次實例化,每個實例可以屬于不同的任務,也可以屬于同一個任務. 2. singleTop > 在這種模式下,如果一個Activity實例已經存在于當前Task的最頂部,那么系統將調用onNewIntent()方法路由到這個實例,而不是創建一個新的Activity實例。 > 一個Activity可以被實例化多次,且可以從屬于不同的Task任務,并且一個任務中可以存在多個Activity實例(這情況僅僅存在于Activity實例不在Task任務的頂端)。 > 假設一個任務的后退棧中有根ActivityA-B-C-D,D位于頂端:再開啟D,back stack中的情形: > 在標準模式下,一個新的類的實例被啟動并且棧變為 A-B-C-D-D > 在singleTop模式,那么這個已存在的ActivityD就通過onNewIntent()接收到intent,因為它在棧的頂端—棧于是依然保持為A-B-C-D > 如果開啟B > 則在singleTop模式下為 A-B-C-D-B > 注:當一個新的activity的實例被創建,用戶可以按下后退鍵回到上一個activity。但當一個已存在的activity實例處理了一個新intent,用戶就不能按下后退鍵回到當前的activity在intent來之前的狀態. 3. singTask > 這種模式下,系統創建一個新的Task,并在Task的底部實例化Activities。然而,當一個activity的實例存在于另一個獨立的Task時,系統不是去創建一個新的實例,而是調用onNewIntent()路由到其他任務的實例。在同一時間,只存在一個Activity實例。 > 注:盡管activity在一個新任務中啟動,后退鍵依然可以返回到上一個activity. 4. singInstance > 于singTask相似,唯獨一點不同的是,這個實例只能在一個單獨的Task中使用。activity永遠是任務的唯一;任何由這個activity啟動的其它activity都在另一個任務中打開. 接上文,關于后退棧,先舉個例子: Android瀏覽器應用聲明網頁瀏覽activity必須在它自己的任務中打開—通過在<activity>元素中指定 singleTask啟動模式。這表示如果你的應用發出一個intent來打開Android瀏覽器,它的activity不會放到你的應用所在的任務中。代替的是,可能一個新的任務為瀏覽器啟動,或者,如果瀏覽器已經運行于后臺,它所在的任務就被弄到前臺并接受這個intent。 不論一個從一個新任務啟動activity還是在一個已存在這種activity的任務中啟動,后退鍵總是能后退到前一個activity。然而,如果你在任務A中啟動一個聲明為singleTask模式的activity,而這個activity可能在后臺已有一個屬于一個任務(任務B)的實例。任務B于是被弄到前臺并處理這個新的intent。那么此時后退鍵會先一層層返回任務BActivity,然后再返回到任務A的頂端activity。圖 4演示了這種情形. ![Android Task和Back Stack詳解 - philn - IT基礎知識](https://box.kancloud.cn/2016-02-18_56c5a953686c7.gif) 圖4.演示一個"singleTask"啟動模式的acitvity如何被添加到一個后退棧中.如果這個activity已經是一個后臺任務(任務B)自己的棧的一部分,那么整個后退棧被弄到前臺,位于當前任務 (任務A)的上面. 注:你使用launchMode屬性的指定的actvitiy的行為可以被intent的flag覆蓋. ##### 如何使用Intent配置管理 在啟動Activity時,你可以通過傳遞一個Intent入參給startActivity()方法,來實現與manifest配置類似功能,改變Activity在task中的行為。 1.FLAG_ACTIVITY_NEW_TASK 在新的任務中啟動activity-即不在本任務中啟動。如果一個包含這個activity的任務已經在運行,那個任務就被弄到前臺并恢復其UI狀態,然后這個已存在的activity在onNewIntent()中接收新的intent。 這個標志產生與"singleTask"相同的行為。 2.FLAG_ACTIVITY_SINGLE_TOP 如果正啟動的activity就是當前的activity(位于后退棧的頂端),那么這個已存在的實例就接收到onNewIntent()的調用,而不是創建一個新的實例。 這產生與"singleTop"模式相同的行為. 3.FLAG_ACTIVITY_CLEAR_TOP 如果要啟動的activity已經在當前任務中運行,那么在它之上的所有其它的activity都被銷毀掉,然后這個activity被恢復,而且通過onNewIntent(),initent被發送到這個activity(現在位于頂部了) 沒有launchMode屬性值對應這種行為。 FLAG_ACTIVITY_CLEAR_TOP多數時候與FLAG_ACTIVITY_NEW_TASK聯用。可以達到這樣的效果:找到在其他Task中存在的Activity,并將它放置到一個可以相應Intent的地方。如果是standard模式,那么它將從stack移除,并新建一個Activity去相應Intent,因為這種模式下,總是新建Activity。 注:如果Activity的啟動模式是"standard",FLAG_ACTIVITY_CLEAR_TOP會導致已存在的activity被從棧中移除然后在這個位置創建一個新的實例來處理到來的intent.這是因為"standard"模式會導致總是為新的intent創建新的實例. #### 啟動模式的區別 哪個任務存放著activity,用來對行為進行響應。**對“standard ”和“singleTop ”模式來說,這個任務是產生行為(并且調用startActivity() )的那個——除非行為對象包含了 FLAG_ACTIVITY_NEW_TASK 標記。在這種情況下,像前面那節Affinities and new tasks? 描述的一樣,將會選擇一個不同的任務。 - **它們是否可以有多個實例。**"standard "和“singleTop ”類型的activity可以被實例化多次。它們可以屬于多個任務,一個特定的任務也可以擁有同一個activity的多個實例。 作為比較"singleTask "和"singleInstance "類型的activity只限定有一個實例。因為這些activity是任務的根。這個限制意味著,在設備上不能同時有超過一個任務的實例。 - **是否能有其他的activity在它所在的任務中。"singleInstance "**類型的 activity是它所在任務中唯一的activity。如果它啟動了其他的activity,不管那個activity的啟動模式如何,它都會加載到一個不同的任務中——好像行為對象中的FLAG_ACTIVITY_NEW_TASK 標記。在其他的方面,"singleInstance " 和"singleTask "模式是相同的。 其他三種模式運行任務中有多個activity。"singleTask "總是任務中的根activity,但是它可以啟動其他的activity并分配到它所在的任務中。"standard "和"singleTop "類型的activity可以出現在任務中的任何地方。 - **是否啟動一個新的實例來處理一個新的行為。**對默認的"standard "模式來說,對于每一個行為都會創建一個新的實例來響應。每個實例只處理一個行為。對于"singleTop "模式,如果一個已經存在的實例位于目標任務activity棧的棧頂,那么他將被重用來處理這個行為。如果它不在棧頂,它將不會被重用,而是為行為創建一個新的實例,并壓入棧中。 #### 處理任務親和關系 默認情況下,一個應用程序中的activity組件彼此之間是親屬關系,也就是說它們屬于同一個任務棧。但是我們可以通過設置某個<activity>標簽的taskAffinity屬性來為這個activity組件設置親屬關系。在不同的應用程序中定義的 activity組件可以共用同一個親屬關系,或者在同一個的應用程序中定義的activity組件可以使用不同的親屬關系。 親屬關系會在兩種情況下發揮作用: 1)負責激活activity組件的Intent對象中包含了FLAG_ACTIVITY_NEW_TASK標志。 在默認情況下,新建一個Activity,會調用startActivity()方法進入Task當中。它放置到和啟動它的Activity相同的back stack。但是,如果啟動的Intent包含了FLAG_ACTIVITY_NEW_TASK標識,系統將為這個Activity尋找一個不同的Task。通常是新建一個新的Task。但是也未必全是這樣,如果存在一與之相同taskAffinity定義的Task,那么這個Activity將運行在那里,否則新建Task。 2)被激活的activity組件的allowTaskReparenting屬性被設置為“true”。 若一個activity組件的allowTaskReparenting被置為“true”,則當與這個activity有相同的親屬關系的任務棧被切換到前臺的時候,這個activity會從當前存在的任務棧中移動到與其有相同的親屬關系的任務棧中。 舉個例子說明這個屬性的作用: 假設一個選擇城市查看天氣的Activity是一個旅游應用程序的一部分。這個Activity與這個應用中的其他Activity有相同affinity,并且設置了這個屬性為true。當你的其他Activity啟動這個查看天氣的Activity時,它和你的Activity屬于同一個Task。但是,當你的旅游應用程序再次展現在前端時,這個查看天氣的Activity會重新分配到旅游應用程序的Task中,并顯示天氣情況。 若從用戶的角度來看,一個.apk文件包含了一個以上的“應用程序”,那你可能要為那些activity組件指定不同的親屬關系。 #### 如何清理后退棧back stack 如果一個用戶離開一個Task很長時間,系統會清理這個Task,當然除了根Activity。當用戶回來時,只剩下這個根Activity,其他的都被銷毀了。系統之所以這樣做,是因為經過一大段時間之后,用戶很可能已拋棄掉他們已經做的并且回到任務開始做一些新的事情。 以下屬性可以設置并改變這種行為方式: - alwaysRetainTaskState 如果在Task的跟Activity中設置這個屬性為true,默認的行為將不再發生,所有Activity的狀態數據將永久保存。 - clearTaskOnLaunch 如果在Task的跟Activity中設置這個屬性為true,當用戶離開或者回到這個Task時,都會清理除了根Activity之外的Activity。換句話說,它是與alwaysRetainTaskState反著來的.用戶回到任務時永遠見到的是初始狀態,即使只離開了一小會。 - finishOnTaskLaunch 類似clearTaskOnLaunch ,但只在一個單獨的Activity中生效,而不是整個Task,它可以清理任何的Activity,包括跟Activity。你為當期會話保存Activity,當用戶回來或者離去,都不將再恢復呈現。 #### 啟動一個task 通過將一個activity類型的intent-filter的動作設置為“android.intent.action.MAIN”,類別設置為 “android.intent.category.LAUNCHER”可以使這個activity實例稱為一個任務棧的入口。擁有這種類型的 intent-filter的activity類型的圖表和名字也會顯示在application launcher中。 例如: ~~~ <activity... > <intent-filter... > <actionandroid:name="android.intent.action.MAIN" /> <categoryandroid:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> ~~~ 一個intent類型的過濾器導致activity的一個圖標和標簽被顯示于應用啟動界面上,使得用戶可以啟動這個activity并且再次回到這個任務。第二個能力是很重要:用戶必須能夠使一個任務棧切換到后臺,也可以隨時將其切換到前臺。出于這個原因,使activity在啟動時新開任務棧的啟動模式(即 “singleTask”和“singleInstance”模式)只應該被利用在擁有擁有“android.intent.action.MAIN”動作和“android.intent.category.LAUNCHER”類別的intent-filter的activity類型上。 想像一下如果沒有這兩個過濾器會發生什么:一個行為啟動了"singleTask"模式的activity,啟動了一個新的任務并且用戶花了一些時間在這個任務上。然后用戶按下了HOME鍵,這個任務被隱藏到了后臺。因為沒有在應用程序加載器上顯示它,所以就沒有辦法返回到這個任務。 一個類似的麻煩事 FLAG_ACTIVITY_NEW_TASK 標志。如果這個標志導致activity啟動了一個新任務,并且用戶按下HOME鍵離開了它,必須有一些方法將用戶引導回它。一些實體(像是通知管理器) 總是在一個外部的任務中啟動activity,而不作為它們的一部分,所以他們總是將帶有FLAG_ACTIVITY_NEW_TASK 標記的行為對象傳遞到startActivity() 。如果你有一個可以被外部實體使用這個標簽調用的activity,要注意用戶應該有辦法返回到啟動的任務。 但遇到那些你不希望用戶能夠回到一個activity的情況時怎么辦呢?有辦法:設置<activity>元素的finishOnTaskLaunch屬性為"true"! 參考: [http://philn.blog.163.com/blog/static/10401475320135144639141/](http://philn.blog.163.com/blog/static/10401475320135144639141/ "http://philn.blog.163.com/blog/static/10401475320135144639141/") [http://blog.csdn.net/wbw1985/article/details/4916909](http://blog.csdn.net/wbw1985/article/details/4916909 "http://blog.csdn.net/wbw1985/article/details/4916909") [http://blog.csdn.net/oracleot/article/details/19036909](http://blog.csdn.net/oracleot/article/details/19036909 "http://blog.csdn.net/oracleot/article/details/19036909") [http://blog.163.com/cazwxy_12/blog/static/898763720122992149143/](http://blog.163.com/cazwxy_12/blog/static/898763720122992149143/ "http://blog.163.com/cazwxy_12/blog/static/898763720122992149143/")
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看