天天看點

【Android】四大元件歸納總結

【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

繼續閱讀