一循榆、Activity的四種啟動模式詳解
-
標準模式(standard)
-
棧頂復用模式(singleTop)
如果新啟動的activity位于任務棧頂主卫,則不會被重新創(chuàng)建,只會重新調用 onPause屿聋、onNewIntent机久、onResume方法臭墨,也就是說會重新走一遍前臺的生命周期;
-
棧內復用模式(singleTask)
只存在唯一的實例膘盖,將該Activity實例之上的Activity被出棧胧弛,一般項目的MainActivity都設置為此模式,方便放回首頁和清空中間Activity侠畔;
-
單例模式(singleInstance)
除了具有singleTask模式的所有特性外结缚,還加強了一點,該Activity只能單獨地位于一個任務棧中软棺。
標記屬性
屬性 | 含義 |
---|---|
FLAG_ACTIVITY_SINGLE_TOP | 指定啟動模式為棧頂復用模式(SingleTop) |
FLAG_ACTIVITY_NEW_TASK | 指定啟動模式為棧內復用模式(SingleTask) |
FLAG_ACTIVITY_CLEAR_TOP | 所有位于其上層的Activity都要移除红竭,SingleTask模式默認具有此標記效果 |
二、android開發(fā)中跨進程通信有幾種方式
-
在android SDK中提供了4種用于跨進程通訊的方式喘落,Activity茵宪、Content Provider、Broadcast和Service揖盘。
1眉厨、 Activity可以跨進程調用其他應用程序;
2兽狭、Content Provider可以跨進程訪問其他應用程序中的數(shù)據(jù)(以Cursor對象形式返回),當然鹿蜀,也可以對其他應用程序的數(shù)據(jù)進行增箕慧、刪、改操 作茴恰;
3颠焦、 Broadcast可以向android系統(tǒng)中所有應用程序發(fā)送廣播,而需要跨進程通訊的應用程序可以監(jiān)聽這些廣播往枣;
4伐庭、Service和Content Provider類似,也可以訪問其他應用程序中的數(shù)據(jù)分冈,但不同的是圾另,Content Provider返回的是Cursor對象,而Service返回的是Java對象雕沉,這種可以跨進程通訊的服務叫AIDL服務集乔。
三、Service相關
-
Service兩種啟動方式 startService坡椒、 bindService 區(qū)別及生命周期
- startService: onCreate -> onStartCommand -> onDestory 扰路,在多次調用startService的時候尤溜,onCreate不重復執(zhí)行,但是onStartCommand會執(zhí)行汗唱。startService調用了這后宫莱,會一直存在,直到其調用了stopService哩罪。
- bindService : onCreate -> onBind -> onUnbind -> onDestory授霸,多次調用bindService,onCreate及onBind都只執(zhí)行一次识椰。它生命周期跟隨其調用者绝葡,調用者釋放的時候,必須對該Service解綁腹鹉,當所有綁定全部取消后藏畅,系統(tǒng)即會銷毀該服務。 bindService 的方式通過onServiceConnected方法功咒,獲取到Service對象愉阎,通過該對象可以直接操作到Service內部的方法,從而實現(xiàn)的Service 與調用者之間的交互力奋。
-
Service綁定服務的三種實現(xiàn)方式榜旦,擴展Binder類、使用Messenger景殷、使用AIDL
服務Service與線程Thread的區(qū)別
1溅呢,兩者概念的迥異
【1】Thread 是程序執(zhí)行的最小單元,它是分配CPU的基本單位猿挚,android系統(tǒng)中UI線程也是線程的一種咐旧,當然Thread還可以用于執(zhí)行一些耗時異步的操作。
【2】Service是Android的一種機制绩蜻,服務是運行在主線程上的铣墨,它是由系統(tǒng)進程托管。它與其他組件之間的通信類似于client和server办绝,是一種輕量級的IPC通信伊约,這種通信的載體是binder,它是在linux層交換信息的一種IPC孕蝉,而所謂的Service后臺任務只不過是指沒有UI的組件罷了屡律。
2,兩者的執(zhí)行任務迥異
【1】在android系統(tǒng)中昔驱,線程一般指的是工作線程(即后臺線程)疹尾,而主線程是一種特殊的工作線程,它負責將事件分派給相應的用戶界面小工具,如繪圖事件及事件響應纳本,因此為了保證應用 UI 的響應能力主線程上不可執(zhí)行耗時操作窍蓝。如果執(zhí)行的操作不能很快完成,則應確保它們在單獨的工作線程執(zhí)行繁成。
【2】Service 則是android系統(tǒng)中的組件吓笙,一般情況下它運行于主線程中,因此在Service中是不可以執(zhí)行耗時操作的巾腕,否則系統(tǒng)會報ANR異常面睛,之所以稱Service為后臺服務,大部分原因是它本身沒有UI尊搬,用戶無法感知(當然也可以利用某些手段讓用戶知道)叁鉴,但如果需要讓Service執(zhí)行耗時任務,可在Service中開啟單獨線程去執(zhí)行佛寿。
3幌墓,兩者使用場景
【1】當要執(zhí)行耗時的網絡或者數(shù)據(jù)庫查詢以及其他阻塞UI線程或密集使用CPU的任務時,都應該使用工作線程(Thread)冀泻,這樣才能保證UI線程不被占用而影響用戶體驗常侣。
【2】在應用程序中,如果需要長時間的在后臺運行弹渔,而且不需要交互的情況下胳施,使用服務。比如播放音樂肢专,通過Service+Notification方式在后臺執(zhí)行同時在通知欄顯示著舞肆。