本文已經收錄到個人Github我的博客,歡迎大佬們光臨寒舍:html
個人GIthub博客java
AndroidManifest.xml
的基本概念Activity
呢?Activity
翻譯爲活動,在Android
中表明瞭界面和以界面爲中心相應的業務邏輯,包括顯示、與用戶交互等,它也是四大組件之一,重要性不言而喻。而且,許多公司在考察Android
的知識點的時候,常常會考察到Activity
的知識。android
所以,深刻了解Activity,不只對你平常的開發有幫助,還對你以後找工做有所增益。git
(1)啓動Activitygithub
(2)打開新的Activity / 切換到桌面緩存
onPause()
-->onStop()
Activity
使用了透明主題,當前的Activity
不會回調onStop,會停留在Paused想要了解Android 透明主題的能夠點擊連接:Android透明主題app
(3)返回舊的Activityide
當舊的Activity不可見:post
當舊的Activity可見:學習
問題思考:當前Activity爲A,打開新的ActivityB,那麼B的
onResume()
和A的onPause()
的執行順序是怎樣的呢?
答案:AonPause()
-->BonResume()
,要獲得這個答案,須要對Activity的工做原理有所瞭解,筆者在本系列文章的後面幾篇會介紹。
小Tips:要關閉Activity的時候,儘可能在
onStop()
中進行耗時操做,而使得新Activity儘快顯示出來。
這個涉及到onSaveInstanceState
和onRestoreInstanceState
方法,具體可見下圖
須要特別留意的是:
onSaveInstanceState
的執行順序,是在onStop
以前,與onPause
沒有既定順序onRestoreInstanceState
的執行順序,是在onStart
以後
Q1:其中保存和恢復View的工做流程是怎樣的呢?
能夠看出,保存和恢復View的工做流程是典型的委託思想,上層委託下層,父容器委託子元素處理事情。
後面會講到的
View
的繪製流程,事件分發機制等,都是纔有相似的思想。
Q2:其中數據恢復的方式有哪些?
在onCreate中恢復
須要注意的是,必需要判斷Bundle是否爲空
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//方法一:在onCreate中調用緩存恢復數據,必需要判斷savedInstanceState是否爲空
if (savedInstanceState != null) {
String test = savedInstanceState.getString("extra_test");
Log.d(TAG, "[onCreate]restore extra_test:" + test);
}
}
複製代碼
在onRestoreInstanceState中恢復
Bundle必定有值,不須要判斷是否爲空,是官方推薦的恢復數據的方法
//利用onRestoreInstanceState
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String test = savedInstanceState.getString("extra_test");
Log.d(TAG, "[onRestoreInstanceState]restore extra_test:" + test);
}
複製代碼
Q1:發生改變的系統配置一般有哪些?
Q2:想系統配置改變後,activity不被從新建立,應該怎麼辦?
在
ActivityManifest.xml
中,對應的Activity
的configChanges
屬性中指定該選項
<activity android:name="com.ryg.chapter_1.MainActivity" android:configChanges="orientation|screenSize" android:label="@string/app_name" android:launchMode="standard" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
複製代碼
這種狀況應該很容易理解,類比於:當使用小內存手機的時候,會發現某些應用常常一切換後臺,就會自動關閉了,原理也是資源內存不足,被系統自動回收了。
Q1:Activity
的優先級排序是什麼?
由上到下,優先級由高到低
Activity
--正在和用戶交互Activity
--好比說,彈出新的對話框,對話框後面的Activity
即屬於可見非前臺Activity
Activity
--已經被中止的Activity
Q2:怎麼提升後臺工做的優先級呢?
將後臺工做放入Service
中,保證進程有必定的優先級
Fragment
的生命週期由於本篇是
Activity
篇,筆者不便大費周章地敘述,爲了知足求知慾強的讀者,筆者特意推薦一篇:Fragment生命週期,裏面寫得很是詳細
Activity
啓動模式Activity
的四種啓動模式a:standard
:標準模式
ApplicationContext
去啓動standard
模式Activity
就會報錯。由於standard模式的Activity會默認進入啓動它所屬的任務棧,可是因爲非Activity的Context沒有所謂的任務棧,因此就會報錯。b:singleTop
:棧頂複用模式
c:singleTask
:棧內複用模式
onNewIntent(intent)
方法。若是不存在,系統會先尋找是否存在須要的棧,若是不存在該棧,就建立一個任務棧,並把該Activity放進去;若是存在,就會查看棧中是否有實例存在,若實例存在,則將實例調到棧頂,並回調onNewIntent(intent)
方法,不然建立實例到已經存在的棧中。d:singleInstance
:單實例模式
標識Activity任務棧名稱的屬性:
android:taskAffinity
,默認爲應用包名。
Activity
的FlagsFlags有不少,這裏介紹幾個經常使用的Flags
FLAG_ACTIVITY_NEW_TASK
:指定singleTask
模式FLAG_ACTIVITY_SINGLE_TOP
:指定singleTop
模式FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
:指定新的Activity不會出如今最近啓動的Activity的列表中原則:
- 一個intent只有同時匹配某個Activity的intent-filter中的
action
、category
、data
纔算徹底匹配,才能啓動該Activity。- 一個Activity能夠有多個intent-filter,一個 intent只要成功匹配任意一組 intent-filter,就能夠啓動該Activity。
Q1:action
的匹配規則
Q2:category
的匹配規則
category
,則要求intent中的category
和intent-filter中的全部category
相同。< category android:name="android.intent.category.DEAFAULT" />
屬性值。Q3:data
匹配規則
action
content
和file
須要注意的是,爲
Intent
指定完整的data的時候,要調用setDataAndType(URI,mimeType)
方法
intent.setDataAndType(Uri.parse("file://abc"),"video/png");
複製代碼
採用隱式方式啓動Activity時,能夠用
PackageManager
的resolveActivity(Intent)
方法或者Intent
的resolveActivity(Intent)
方法,來判斷是否有Activity匹配該隱式Intent,若是匹配不到,會返回NULL
恭喜你,已經看完了前面的文章,相信你對
Activity
已經有必定深度的瞭解,下面,進行一下課堂小測試,驗證一下本身的學習成果吧!
題目情景:有三個Activity
,分別名爲A
,B
,C
,A
的啓動模式是standard
,B
和C
的啓動模式是singleTask
,如今進行以下操做:A啓動了B,B啓動了C,C啓動了A,A再啓動B,如今連按2次BACK
,你看到的是哪一個Activity
?
答案揭曉:回到桌面,具體過程能夠參考下面的流程圖
若是文章對您有一點幫助的話,但願您能點一下贊,您的點贊,是我前進的動力
本文參考連接: