Activity--啟動模式

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

  • 參考文檔

Android中Activity的啟動模式(LaunchMode)和使用場景

【安全開發(fā)】Android安全編碼規(guī)范

[android開發(fā)篇]自定義權限

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容