【Android】四大元件歸納總結
随着學習持續更新
四大元件均可使用android:process="name"在Manifest中聲明成獨立程序
Activity#
生命周期#
4種啟動模式#
Android使用回退棧來管理Activity執行個體。目前顯示的Activity在棧頂,當點選後退或傳回時,棧頂的Activity出棧。
可以指定Activity的啟動模式來避免重複建立同一Activity
在AndroidManifest.xml中聲明Activity的啟動模式
Copy
android:lauchMode="singleTask"></activity>
standard
預設的啟動模式,允許Activity被多次執行個體化,一個任務棧中會有多個Activity執行個體
singleTop
處于棧頂的Activity會被重用,若不在棧頂則會被重新建立。重用時會調用原來執行個體的onNewIntent()函數
singleTask(常用)
一個任務棧隻允許存在一個Activity執行個體,當startActivity()時,若該Activity在棧内,則會将該Activity上的所有Activity銷毀,使該Activity處于棧頂,并調用onNewIntent()方法
singleInstance
一個Activity在獨立的任務中開啟,保證在系統中隻有一個執行個體,所有的startActivity()都會重用該執行個體,并回調onNewIntent()方法
兩個Activity互相切換時的生命周期#
A:onCreate->onStart->onResume
這是在A中啟動B活動,生命周期如下:
A: onPause
B: onCreate->onStart->onResume
A: onStop
從B中傳回A活動時
B: onPause
A: onRestart->onStart->onResume
B: onStop->onDestroy
Service#
https://blog.csdn.net/javazejian/article/details/52709857當程式進入背景運作時,所需要做的操作可以通過Service實作。
在任何位置調用startService()啟動服務。
每個服務隻存在一個執行個體,每次調用startService()時會回調onStartCommand();隻需要調用一次stopService()或stopSelf()函數,服務會被停止。
普通Service運作在UI線程,若需要執行耗時操作需要新開線程。
onCreate()
onStartCommand(intent, flags, startId)
有三種傳回值
START_STICKY:當服務因記憶體不足被kill掉後,記憶體空閑時會嘗試重建服務,重建成功則回調onStartCommand(),這是傳入的intent為null
START_NOT_STICKY:當Service因記憶體不足而被系統kill後,即使系統記憶體再次空閑時,系統也不會嘗試重新建立此Service
START_REDELIVER_INTENT:當Service因記憶體不足而被系統kill後,則會重建服務,并通過傳遞給服務的最後一個 Intent 調用 onStartCommand(),這個值适用于主動執行應該立即恢複的作業(例如下載下傳檔案)的服務
onDestroy()
調用stopService()或stopSelf()
IntentService#
重寫onHandleIntent()函數,在函數中完成耗時操作。IntentService會自動将操作執行在子線程中,并在完成時調用stopSelf()自我銷毀
public class MyIntentService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
...
}
}
Binder(與服務連接配接)#
當服務僅限本地應用使用,不需要跨程序工作,則可以實作自有的Binder類,讓用戶端通過該類直接通路服務中的公共方法。
首先需要建立ServiceConnection對象,代表與服務的連接配接,有兩個方法
onServiceConnected(name, serivce)
系統會調用該方法傳遞服務的onBind()方法傳回的IBinder, 通過該對象可以調用擷取到Service的執行個體對象,進而調用服務端的公共方法。
onServiceDisconnected(name)
系統與服務意外中斷時調用,unBind不會調用該方法
調用bindService(intent, ServiceConnection, flag)綁定相關服務,flag指綁定時是否自動建立Service,0表示不建立;BIND_AUTO_CREATE表示自動建立。
調用unbindService(ServiceConnection)
當最後一個用戶端與服務取消綁定時,系統會将服務銷毀
前台服務#
startForeground(int id, Notification notification)
将目前服務設成前台服務,id參數為唯一辨別通知的整型數,不得為0
stopForeground(boolean removeNotification)
Android8.0後需要開啟前台服務要在Activity中startForegroundService(i),且之後Service要在5s内調用startForeground()才能成功建立前台服務
如何保證Service不被殺死#
記憶體資源不足
将onStartCommand()傳回值設成START_STICKY或START_REDELIVER_INTENT,這樣記憶體組後也會恢複服務
将服務設成前台服務,具備較高優先級
使用者手動幹預
如果不是force stop則會調用生命周期中的onDestroy()方法,可以在方法中發送廣播重新開機服務。完備一些的話就啟動兩個服務,互相監聽,互相重新開機。
Broadcast#
https://www.jianshu.com/p/ca3d87a4cdf3組成:發送廣播的Broadcast,接受廣播的BroadcastReceiver和傳遞消息的Intent。
類型:普通廣播、有序廣播、本地廣播(LocalBroadcast)、Sticky廣播
靜态廣播與動态廣播#
廣播可分為靜态注冊和動态注冊兩種形式
靜态注冊
在Manifest.xml中聲明靜态廣播
<intent-filter android:priority=1000>
<action android:name="com.broadcast"
</intent-filter>
動态注冊
可以在onCreate的時候注冊
MyBroadcastReceiver receiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter("my.action");
context.registerReceiver(receiver, filter);
在onDestroy的時候登出
unregisterReceiver(receiver);
靜态廣播與動态廣播的差別
靜态廣播在activity登出的時候也能夠繼續接收;動态廣播在APP退出後就無法接收了
動态廣播在相同Priority下優先級比靜态廣播高
普通廣播#
異步廣播,調用sendBroadcast(new Intent(ACTION))來發出廣播
定義廣播接收器
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
...
}
在AndroidManifest.xml中注冊:
<intent-filter>
<action android:name=".."/>
</intent-filter>
動态注冊接收器:
registerReceiver(new MyBroadcastReceiver(), new IntentFilter(MY_ACTION));
有序廣播#
發送出去的廣播被廣播的接收者按照先後順序接收
接收的順序排序
按照Priority屬性值從大到小
Priority相同則動态注冊廣播優先
本地廣播#
隻限于應用的廣播
使用LocalBroadcastManager.getInstance(context)來使用關于廣播的操作函數:
registerReceiver(receiver, intentFilter)
unregisterReceiver(receiver)
sendBroadcast(new Intent(INTENT_NAME))
sendBroadcastSync(new Intent())
注冊本地廣播
mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
mReceiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_MY_TYPE);
mLocalBroadcastManager.registerReceiver(mReceiver,filter);
需要在onDestory()的中進行登出:
mLocalBroadcastManager.unregisterReceiver(mReceiver)
ContentProvider#
ContentProvider可以将應用中的資料共享給其他應用通路,其他應用可以通過ContentProvider對應用中的資料進行增删改查。
也可以進行程序間資料的互動和共享,跨程序通信。
作者: y4ngyy
出處:
https://www.cnblogs.com/y4ngyy/p/12496745.html