1.Activity
啟動模式
-
四種啟動模式
Activity的啟動模式有四種:standard、singleTop、singleTask和singleInstance。
singleTop:棧頂復用模式。如果要啟動的Activity已經處于棧的頂部,那么此時系統(tǒng)不會創(chuàng)建新的實例,而是直接打開此頁面,同時它的onNewIntent()方法會被執(zhí)行onCreate(),onStart()方法不會被調用。
singleTask:棧內復用模式。如果棧中存在這個Activity的實例就會復用這個Activity,不管它是否位于棧頂,復用時,會將它上面的Activity全部出棧,因為singleTask本身自帶clearTop這種功能。并且會回調該實例的onNewIntent()方法。
-
使用場景
- standard:正常的去打開一個新的頁面
- singleTop:消息推送界面。如果當前停留在消息詳情界面A,突然來推送消息了,點擊推送消息,又創(chuàng)建了一個詳情界面A,按返回鍵back,還是停留在這個詳情界面A,造成視覺差異
- singleTask:PP的首頁,因為一般為一個APP的第一個頁面,且長時間保留在棧中。
- singleInstance:
(1)一般用于加載較慢的,比較耗性能且不需要每次都重新創(chuàng)建的Activity。
(2)不同程序共享activity實例。
(3)電話撥號盤頁面,通過自己的應用或者其他應用打開撥打電話頁面 ,只要系統(tǒng)的棧中存在該實例,那么就會直接調用。
在使用APP過程中,不可避免頁面之間的跳轉,那么就會涉及到啟動模式。其實在對界面進行跳轉時,Android系統(tǒng)既能在同一個任務中對Activity進行調度,也能以Task(任務棧)為單位進行整體調度。在啟動模式為standard或singleTop時,一般是在同一個任務中對Activity進行調度,而在啟動模式為singleTask或singleInstance是,一般會對Task進行整體調度。
-
配置方式
Manifest中配置
<activity
android:name=".XxxActivity"
android:launchMode="standard">
</activity>
singleTask不設置taskAffinity屬性,也就是默在同一個任務棧中.
設置taskAffinity屬性,singleTask所在的Activity與啟動它的Activity處于不同的任務棧中。
<activity
android:name=".SingleTaskActivity"
android:launchMode="singleTask">
</activity>
android:launchMode="singleTop"
android:launchMode="singleInstance"
對于標準模式,android:launchMode=”standard”可以不寫,因為默認就是standard模式。
- 移動編碼規(guī)范
1.預防組件最小化組件暴露
針對不需要進行跨應用調用的組件,應在配置文件(AndroidManifest.xml)中顯示配置android:exported="false"屬性。
組件配置android:exported="false"屬性,表明它為私有組件,只可在同一個應用程序組件間或帶有相同用戶ID的應用程序間才能啟動或綁定該服務。在非必要情況下,如果該屬性設置為“true”,則該組件可以被任意應用執(zhí)行啟動操作,造成組件惡意調用等風險。
2.公開的組件安全
因特殊需要而公開的Activity、Service、Broadcast Receiver、Content Provider組件建議添加自定義permission權限進行訪問控制。
1)AndroidManifest.xml中的定義/注冊權限的寫法為:
<permission
android:name="com.ijiami.permission.testPermission"
android:label="@string/app_name"
android:protectionLevel="normal" />
2)AndroidManifest.xml中Activity組件使用已注冊的自定義權限寫法為:
<activity
android:name="com.example.bkdemo2.LoginActivity"
android:exported="true"
android:label="@string/app_name"
android:permission="com.ijiami.permission.testPermission" >
</activity>
3)外部應用需要使用自定義權限的寫法(AndroidManifest.xml配置)為:
<uses-permission android:name="com.ijiami.permission.testPermission" />
3.顯示調用intent
- 參考文檔