一、Activity的生命週期

Activity生命週期

1.onStart和onResume、onPause和onStop從描述上來看差不多,對我們來說有什麼實質的不同呢?

從實際的使用過程來說,onStart和onResume、onPause和onStop看起來的確差不多,這兩個配對的回調分別代表不同的意義,onStart和onStop是從Activity是否可見這個角度來回調的,而onResumeheonPause是從Activity是否位於前臺這個角度來回調的,除了這種區別,在實際的使用中沒有其他明顯的區別。

2.假設當前的Activity爲A,如果這個時候用戶打開一個新的Activity B,那麼B的onResume和A的onPause哪個先執行呢?

當啓動一個新的Activity的時候,舊的Activity的onPause會先執行,然後纔會啓動新的Activity。所以Activity的onPause不能做耗時操作,儘量在onStop裏面處理。

3.異常情況下的Activity的生命週期?

系統配置發生改變,Activity會被銷燬,其onPause,onStop,onDestroy均會被調用,同時由於Activity是在異常情況下終止的,系統會調用onSaveInstanceState來保存當前的Activity的狀態。這個方法的調用時機是在onStop之前,它和onPause沒有既定的時序關係,當Activity被重新創建的後系統會調用onRestoreInstanceState和onCreate方法來判斷Activity是否被重建了,從時序上來說,onRestoreInstanceState的調用時機在onStart之後。

4.系統配置發生改變Activity不重新創建?

給Activity指定android:configChanges=”orientation”如果要指定多個值可以使用 | 連接起來。
意義:
locale 本地位置發生了改變,一般指切換了系統語言
keyboardHidden鍵盤的可訪問性發生了變化,比如用戶調出了鍵盤
orientation:屏幕方向發生了變化,這個是最常用的,比如旋轉了手機屏幕
screenSize:當屏幕的尺寸信息發生了變化,當旋轉設備屏幕的時候,屏幕尺寸會發生變化,這個比較特殊,當編譯選項的miniSdkVersion和targetSdkVersion均低於13時,次選項不會導致Activity重啓。

5.Activity的Flags?

Intent.FLAG_ACTIVITY_NEW_TASK
singTask啓動模式
FLAG_ACTIVITY_SINGLE_TOP
singleTop啓動模式
FLAG_ACTIVITY_CLEAR_TOP
位於它上面的Activity都要出棧
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
不會出現在歷史Activity列表中

6.Intent-Filter匹配規則?

爲了匹配過濾列表,需要同時匹配過濾列表中的action,category,data信息,否則,匹配失敗
action匹配規則:
action的匹配規則是Intent中的action必須能和過濾規則中的某個action一模一樣,即是字符串一模一樣。
category匹配規則:
如果有category,category必須是已經在過濾規則中定義了的。可以沒有,因爲啓動Activity的時候默認爲Intent添加了一個”android.intent.category.DEFAULT”,所以爲了我們的Activity能夠接收到隱式調用,必須在Intent-Filter中指定”android.intent.category.DEFAULT”這個Category。
data的匹配規則:
如果過濾規則中定義了data那麼,Intent中也必須定義一樣的data。
data的結構:

<data
android:scheme="string"
android:host="string"
android:port="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:mimeType="string"
/>

data由兩部分組成,mimeType和URI。mimeType是值媒體類型,比如image/jepg,audio/mpeg4-generic和video/*等,可以表示圖片,文本,視頻等不同格式的媒體格式。
URI結構:

<scheme>://<host>:<port>/[path]|[pathPrefix]|[pathPattern]

例如:

content://com.example.project:200/folder/subfolder/etc
http://www.baidu.com:80/search/info

Scheme:URI的模式,如http,file,content,如果沒有指定這個則URI無效。
Host:URI的主機名,沒有指定則URI無效。
Port:URI的端口號,只有scheme和host參數有效port纔有意義。
Path,pathPattern和pathPrefix:路徑信息。
例子:

<intent-filter>
<data android:mimeType="image/*" />
...
</ intent-filter>

指定了mimeType爲圖片類型,這個過濾規則雖然沒有指定URI,但是卻有默認的值,URI的默認值爲content和file,所以Intent的URI必須指定爲content或者file才能匹配。
可以寫:

intent.setDataAndType(Uri.parse("file://abc"),"image/png");

通過隱式方式啓動Activity的時候,可以使用PackageManager或者Intent的resolveActivity方法,如果找不到返回null,PackageManager還提供了queryIntentActivities方法,這個返回所有匹配的Activity信息。
resolveActivity(Intent intent, int flags);
第二個參數使用MATCH_DEFAULT_ONLY這個標記位,表示僅僅匹配,Intent-Filter裏面android.intent.category.DEFAULT這個Category的Activity,因爲不包含DEFAULT這個Category的是不能接收隱式Intent的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章