Amadeus復(fù)刻計(jì)劃(App篇 四)
項(xiàng)目中的理解難點(diǎn)——Intent:(示例代碼大部分為Amadeus項(xiàng)目源碼)
功能概述
可以實(shí)現(xiàn)應(yīng)用間的不同組件交互(如應(yīng)用內(nèi)跳轉(zhuǎn))或是不同應(yīng)用之間的交互(有的軟件可以調(diào)用系統(tǒng)瀏覽器,就是用的這個(gè))
使用方法(以實(shí)用為主,故不過(guò)多贅述參數(shù),詳情查文檔)
顯式調(diào)用:
Intent intent = new Intent(LaunchActivity.this, MainActivity.class);
startActivity(intent);上文代碼意為從launchActivity跳轉(zhuǎn)至MainActivity(軟件中用于從啟動(dòng)界面跳轉(zhuǎn)至語(yǔ)音交互界面)
顯示調(diào)用基本就是這樣,很簡(jiǎn)單故不作贅述
隱式調(diào)用
顯式調(diào)用中明確指出了跳轉(zhuǎn)至哪個(gè)頁(yè)面(MainActivity),但有的時(shí)候我們并不需要這么做,比如調(diào)用瀏覽器訪問(wèn)網(wǎng)頁(yè),無(wú)論是哪個(gè)瀏覽器都能滿足需求,故只需要指定“瀏覽器”這個(gè)寬泛的概念即可,而不是必須使用“谷歌瀏覽器”(例)
Intent?intent?=?new?Intent();
intent.setAction("com.example.a3_30intent.action.MY_ACTION");
上面代碼即為隱式調(diào)用,其中setAction中的參數(shù)是一個(gè)字符串,該字符串內(nèi)容與安卓項(xiàng)目中的Manifest.xml相對(duì)應(yīng)(那個(gè)注冊(cè)activity的文件),需要被隱式調(diào)用的activity需要在其中加入<intent-fliter>標(biāo)簽,并在該標(biāo)簽內(nèi)設(shè)置action android:name屬性。實(shí)際上隱式調(diào)用所指定的setAction參數(shù)就是匹配的該name,當(dāng)然并不限于同應(yīng)用,如果知道其他應(yīng)用的name值,也可以調(diào)用該應(yīng)用的相應(yīng)組件
在本項(xiàng)目中隱式調(diào)用使用了一種變形,作者使用preference構(gòu)造了設(shè)置界面(用于選擇界面語(yǔ)言、設(shè)定鬧鐘等功能),其中點(diǎn)擊set up會(huì)跳轉(zhuǎn)至單獨(dú)的activity用于設(shè)定鬧鐘。其實(shí)現(xiàn)方式為在preference的框架下新建類似這樣的標(biāo)簽結(jié)構(gòu)
<Preference android:title="@string/pref_alarm_setup">
? ?<intent
? ? ? ?android:action="android.intent.action.VIEW.ALARM"
? ? ? ?/>
</Preference>其中intent標(biāo)簽就是實(shí)現(xiàn)隱式調(diào)用的方法,action的值為目標(biāo)activity,筆者第一次遇見(jiàn)的時(shí)候還頗為疑惑。
PendingIntent
PendingIntent可以視作是Intent的一種封裝,上面提到的調(diào)用intent的方法都是類似于“點(diǎn)擊即用”的方式,但如果你想要定時(shí)啟動(dòng)某服務(wù),或者滿足某種觸發(fā)條件再啟動(dòng)就不是很方便。于是PendingIntent就出現(xiàn)了,筆者的個(gè)人理解是PendingIntent是提前設(shè)定好滿足觸發(fā)條件后的行為(但此時(shí)并沒(méi)有調(diào)用),當(dāng)滿足一定條件后才開(kāi)始調(diào)用。
值得注意的是,定義PendingIntent時(shí)需要指定Flag參數(shù),而該參數(shù)會(huì)因安卓api版本不同而不同,更要命的是如果設(shè)置錯(cuò)誤應(yīng)用會(huì)直接閃退,難以排查,折騰了筆者許久,希望后來(lái)者注意。(api>31時(shí)為PendingIntent.FLAG_IMMUTABLE)
intent模塊筆者所使用到的大概就是上述這些,下文再略作討論下項(xiàng)目的消息通知機(jī)制(就是一般應(yīng)用的橫幅彈窗)
項(xiàng)目中的消息通知函數(shù)寫的基本沒(méi)有問(wèn)題,唯一需要注意的是安卓高版本需要指定NotificationChannel來(lái)自定義通知重要級(jí),當(dāng)然這也很合理,開(kāi)發(fā)者指定消息重要級(jí),然后交由用戶判斷是否接收該通知,可以有效治理流氓軟件的行為
ps:原項(xiàng)目中設(shè)定的鬧鐘響時(shí)發(fā)送消息與進(jìn)入啟動(dòng)頁(yè)面發(fā)送消息,這兩處的代碼有所不同,筆者修改為了與后者保持一致,應(yīng)該沒(méi)太大問(wèn)題。
pps:用兩臺(tái)電腦開(kāi)發(fā)數(shù)據(jù)遷移實(shí)在太麻煩,明天折騰下git同步,希望AS里面的設(shè)置不要太復(fù)雜……就這樣吧
? ? ? ? ?
????????????