日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

[Android]《Android艺术开发探索》第一章读书笔记

發(fā)布時(shí)間:2025/5/22 Android 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Android]《Android艺术开发探索》第一章读书笔记 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 典型情況下生命周期分析

  • (1)一般情況下,當(dāng)當(dāng)前Activity從不可見(jiàn)重新變?yōu)榭梢?jiàn)狀態(tài)時(shí),onRestart方法就會(huì)被調(diào)用。

  • (2)當(dāng)用戶(hù)打開(kāi)新的Activity或者切換到桌面的時(shí)候,回調(diào)如下:onPause -> onStop,但是如果新Activity采用了透明主題,那么onStop方法不會(huì)被回調(diào)。當(dāng)用戶(hù)再次回到原來(lái)的Activity時(shí),回調(diào)如下:onRestart -> onStart -> onResume。

  • (3)onStart和onStop對(duì)應(yīng),它們是從Activity是否可見(jiàn)這個(gè)角度來(lái)回調(diào)的;onPause和onResume方法對(duì)應(yīng),它們是從Activity是否位于前臺(tái)這個(gè)角度來(lái)回調(diào)的。

  • (4)從Activity A進(jìn)入到Activity B,回調(diào)順序是onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) -> onStop(A),所以不能在onPause方法中做重量級(jí)的操作。

2. 異常情況下生命周期分析

  • (1)onSaveInstanceState方法只會(huì)出現(xiàn)在Activity被異常終止的情況下,它的調(diào)用時(shí)機(jī)是在onStop之前,它和onPause方法沒(méi)有既定的時(shí)序關(guān)系,可能在它之前,也可能在它之后。當(dāng)Activity被重新創(chuàng)建的時(shí)候,onRestoreInstanceState會(huì)被回調(diào),它的調(diào)用時(shí)機(jī)是onStart之后。
    系統(tǒng)只會(huì)在Activity即將被銷(xiāo)毀并且有機(jī)會(huì)重新顯示的情況下才會(huì)去調(diào)用onSaveInstanceState方法。
    當(dāng)Activity在異常情況下需要重新創(chuàng)建時(shí),系統(tǒng)會(huì)默認(rèn)為我們保存當(dāng)前Activity的視圖結(jié)構(gòu),并且在Activity重啟后為我們恢復(fù)這些數(shù)據(jù),比如文本框中用戶(hù)輸入的數(shù)據(jù)、listview滾動(dòng)的位置等,這些view相關(guān)的狀態(tài)系統(tǒng)都會(huì)默認(rèn)為我們恢復(fù)。具體針對(duì)某一個(gè)view系統(tǒng)能為我們恢復(fù)哪些數(shù)據(jù)可以查看view的源碼中的onSaveInstanceState和onRestoreInstanceState方法。

  • (2)Activity按優(yōu)先級(jí)的分類(lèi)
    前臺(tái)Activity;可見(jiàn)但非前臺(tái)Activity;后臺(tái)Activity

  • (3)android:configChanges="xxx"屬性,常用的主要有下面三個(gè)選項(xiàng):
    local:設(shè)備的本地位置發(fā)生了變化,一般指切換了系統(tǒng)語(yǔ)言;
    keyboardHidden:鍵盤(pán)的可訪問(wèn)性發(fā)生了變化,比如用戶(hù)調(diào)出了鍵盤(pán);
    orientation:屏幕方向發(fā)生了變化,比如旋轉(zhuǎn)了手機(jī)屏幕。
    配置了android:configChanges="xxx"屬性之后,Activity就不會(huì)在對(duì)應(yīng)變化發(fā)生時(shí)重新創(chuàng)建,而是調(diào)用Activity的onConfigurationChanged方法。

1.2 Activity的啟動(dòng)模式

1.2.1 啟動(dòng)模式

  • (1)當(dāng)任務(wù)棧中沒(méi)有任何Activity的時(shí)候,系統(tǒng)就會(huì)回收這個(gè)任務(wù)棧。

  • (2)從非Activity類(lèi)型的Context(例如ApplicationContext、Service等)中以standard模式啟動(dòng)新的Activity是不行的,因?yàn)檫@類(lèi)context并沒(méi)有任務(wù)棧,所以需要為待啟動(dòng)Activity指定FLAG_ACTIVITY_NEW_TASK標(biāo)志位。

  • (3)任務(wù)棧分為前臺(tái)任務(wù)棧和后臺(tái)任務(wù)棧,后臺(tái)任務(wù)棧中的Activity位于暫停狀態(tài),用戶(hù)可以通過(guò)切換將后臺(tái)任務(wù)棧再次調(diào)到前臺(tái)。

  • (4)參數(shù)TaskAffinity用來(lái)指定Activity所需要的任務(wù)棧,意為任務(wù)相關(guān)性。默認(rèn)情況下,所有Activity所需的任務(wù)棧的名字為應(yīng)用的包名。TaskAffinity屬性主要和singleTask啟動(dòng)模式或者allowTaskReparenting屬性配對(duì)使用,在其他情況下沒(méi)有意義。
    當(dāng)TaskAffinity和singleTask啟動(dòng)模式配對(duì)使用的時(shí)候,它是具有該模式的Activity的目前任務(wù)棧的名字,待啟動(dòng)的Activity會(huì)運(yùn)行在名字和TaskAffinity相同的任務(wù)棧中;
    當(dāng)TaskAffinity和allowTaskReparenting結(jié)合的時(shí)候,當(dāng)一個(gè)應(yīng)用A啟動(dòng)了應(yīng)用B的某個(gè)Activity C后,如果Activity C的allowTaskReparenting屬性設(shè)置為true的話(huà),那么當(dāng)應(yīng)用B被啟動(dòng)后,系統(tǒng)會(huì)發(fā)現(xiàn)Activity C所需的任務(wù)棧存在了,就將Activity C從A的任務(wù)棧中轉(zhuǎn)移到B的任務(wù)棧中。

  • (5)singleTask模式的具體分析:當(dāng)一個(gè)具有singleTask啟動(dòng)模式的Activity請(qǐng)求啟動(dòng)之后,系統(tǒng)首先會(huì)尋找是否存在A想要的任務(wù)棧,如果不存在,就重新創(chuàng)建一個(gè)任務(wù)棧,然后創(chuàng)建Activity的實(shí)例把它放到棧中;如果存在Activity所需的任務(wù)棧,這時(shí)候要看棧中是否有Activity實(shí)例存在,如果有,那么系統(tǒng)就會(huì)把該Activity實(shí)例調(diào)到棧頂,并調(diào)用它的onNewIntent方法(它之上的Activity會(huì)被迫出棧,所以singleTask模式具有FLAG_ACTIVITY_CLEAR_TOP效果);如果Activity實(shí)例不存在,那么就創(chuàng)建Activity實(shí)例并把它壓入棧中。

  • (6)設(shè)置啟動(dòng)模式既可以使用xml屬性android:launchMode,也可以使用代碼intent.addFlags()。區(qū)別在于限定范圍不同,前者無(wú)法直接為Activity設(shè)置FLAG_ACTIVITY_CLEAR_TOP標(biāo)識(shí),而后者無(wú)法為Activity指定singleInstance模式。

1.3 IntentFilter的匹配規(guī)則

  • (1)IntentFilter中的過(guò)濾信息有action、category、data,為了匹配過(guò)濾列表,需要同時(shí)匹配過(guò)濾列表中的action、category、data信息,否則匹配失敗。一個(gè)過(guò)濾列表中的action、category、data可以有多個(gè),所有的action、category、data分別構(gòu)成不同類(lèi)別,同一類(lèi)別的信息共同約束當(dāng)前類(lèi)別的匹配過(guò)程。只有一個(gè)Intent同時(shí)匹配action類(lèi)別、category類(lèi)別和data類(lèi)別才算完全匹配,只有完全匹配才能成功啟動(dòng)目標(biāo)Activity。此外,一個(gè)Activity中可以有多個(gè)intent-filter,一個(gè)Intent只要能匹配任何一組intenf-filter即可成功啟動(dòng)對(duì)應(yīng)的Activity。
<intent-filter><action android:name="com.ryg.charpter_1.c" /><action android:name="com.ryg.charpter_1.d" /><category android:name="com.ryg.category.c" /><category android:name="com.ryg.category.d" /><category android:name="android.intent.category.DEFAULT" /><data android:mimeType="text/plain" /> </intent-filter>
  • (2)action匹配規(guī)則
    只要Intent中的action能夠和過(guò)濾規(guī)則中的任何一個(gè)action相同即可匹配成功,action匹配區(qū)分大小寫(xiě)。

  • (3)category匹配規(guī)則
    Intent中如果有category那么所有的category都必須和過(guò)濾規(guī)則中的其中一個(gè)category相同,如果沒(méi)有category的話(huà)那么就是默認(rèn)的category,即android.intent.category.DEFAULT,所以為了Activity能夠接收隱式調(diào)用,配置多個(gè)category的時(shí)候必須加上默認(rèn)的category。

  • (4)data匹配規(guī)則
    data的結(jié)構(gòu)很復(fù)雜,語(yǔ)法大致如下:
<data android:scheme="string" android:host="string" android:port="string" android:path="string" android:pathPattern="string" android:pathPrefix="string" android:mimeType="string" />

主要由mimeType和URI組成,其中mimeType代表媒體類(lèi)型,而URI的結(jié)構(gòu)也復(fù)雜,大致如下:

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

例如content://com.example.project:200/folder/subfolder/etc

scheme、host、port分別表示URI的模式、主機(jī)名和端口號(hào),其中如果scheme或者h(yuǎn)ost未指定那么URI就無(wú)效。

path、pathPattern、pathPrefix都是表示路徑信息,其中path表示完整的路徑信息,pathPrefix表示路徑的前綴信息;pathPattern表示完整的路徑,但是它里面包含了通配符(*)。

data匹配規(guī)則:Intent中必須含有data數(shù)據(jù),并且data數(shù)據(jù)能夠完全匹配過(guò)濾規(guī)則中的某一個(gè)data。
URI有默認(rèn)的scheme!
如果過(guò)濾規(guī)則中的mimeType指定為image/或者text/等這種類(lèi)型的話(huà),那么即使過(guò)濾規(guī)則中沒(méi)有指定URI,URI有默認(rèn)的scheme是content和file!如果過(guò)濾規(guī)則中指定了scheme的話(huà)那就不是默認(rèn)的scheme了。

//URI有默認(rèn)值 <intent-filter><data android:mimeType="image/*"/>... </intent-filter> //URI默認(rèn)值被覆蓋 <intent-filter><data android:mimeType="image/*" android:scheme="http" .../>... </intent-filter>

如果要為Intent指定完整的data,必須要調(diào)用setDataAndType方法!
不能先調(diào)用setData然后調(diào)用setType,因?yàn)檫@兩個(gè)方法會(huì)彼此清除對(duì)方的值。

intent.setDataAndType(Uri.parse("file://abc"), "image/png");
data的下面兩種寫(xiě)法作用是一樣的:

<intent-filter><data android:scheme="file" android:host="www.github.com"/> </intent-filter><intent-filter><data android:scheme="file"/><data android:host="www.github.com"/> </intent-filter>

如何判斷是否有Activity能夠匹配我們的隱式Intent?
(1)PackageManager的resolveActivity方法或者Intent的resolveActivity方法:如果找不到就會(huì)返回null
(2)PackageManager的queryIntentActivities方法:它返回所有成功匹配的Activity信息
針對(duì)Service和BroadcastReceiver等組件,PackageManager同樣提供了類(lèi)似的方法去獲取成功匹配的組件信息,例如queryIntentServices、queryBroadcastReceivers等方法

有一類(lèi)action和category比較重要,它們?cè)谝黄鹩脕?lái)標(biāo)明這是一個(gè)入口Activity,并且會(huì)出現(xiàn)在系統(tǒng)的應(yīng)用列表中。

<intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /> </intent-filter>

轉(zhuǎn)載于:https://www.cnblogs.com/zhousysu/p/5483781.html

總結(jié)

以上是生活随笔為你收集整理的[Android]《Android艺术开发探索》第一章读书笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。