欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Android的四大應(yīng)用程序組件

 更新時(shí)間:2021年01月16日 14:50:27   作者:https://segmentfault.com/a/1190000038997033  
這篇文章主要介紹了Android的應(yīng)用程序組件的相關(guān)資料,幫助大家更好的理解和使用Android,感興趣的朋友可以了解下

Android的一個(gè)核心特性就是一個(gè)應(yīng)用程序可作為其他應(yīng)用程序中的元素,可為其他應(yīng)用程序提供數(shù)據(jù)。例如,如果程序需要用某些控件來(lái)加載一些圖片,另一個(gè)程序已經(jīng)開(kāi)發(fā)出了此項(xiàng)功能,且可供其他程序使用,就可以直接使用跨進(jìn)程通信方式調(diào)用那個(gè)程序的功能,而不是自己再開(kāi)發(fā)一個(gè)。為了實(shí)現(xiàn)這樣的功能,Android系統(tǒng)必須能夠在需要應(yīng)用程序中的任何一部分時(shí)啟動(dòng)它的進(jìn)程,并且實(shí)例化那部分的Java對(duì)象。所以,不像大多數(shù)其他系統(tǒng)中的程序,Android程序不是只有單一的進(jìn)入點(diǎn),而是它們擁有系統(tǒng)實(shí)例化和運(yùn)行必須的組件,Android中提供了4大組件;Android中的四大組件除了BroadcastReceiver之外,Activity、Service、ContentProvider都要必須在AndroidManifest.xml中注冊(cè),而B(niǎo)roadcastReceiver可以在AndroidManifest.xml文件中注冊(cè),也可以在Java代碼或者kotlin代碼中注冊(cè);在Android 8.0后,在AndroidManifest.xml文件中靜態(tài)注冊(cè)廣播接收失效,是因?yàn)楣俜綄?duì)耗電量的優(yōu)化,避免APP濫用廣播的一種處理方式。

1、Activity

Activty是一種展示型組件,Activity為用戶(hù)提供了一個(gè)可視的用戶(hù)界面。例如,一個(gè)撥打電話程序可能有一個(gè)Activity用來(lái)顯示可以撥打電話的聯(lián)系人,第二個(gè)Activity用來(lái)新建聯(lián)系人寫(xiě)信息,其他的Activity用來(lái)查看具體的聯(lián)系人,或者更改聯(lián)系人信息,雖然應(yīng)用程序中的各個(gè)Activity所提供的用戶(hù)界面聚合性很強(qiáng),但是每個(gè)Activity都獨(dú)立于其他的Activity,每一個(gè)實(shí)例化的Activity都是Activity的子類(lèi),Intent可觸發(fā)了Activity的啟動(dòng),Intent可分為顯式Intent觸發(fā)和隱式Intent觸發(fā);顯式Intent觸發(fā)可明確的指向Activity組件,用如下代碼表示:

 Intent in = new Intent(this,SecondActivity.class)
 MainActivity.this.startActivity(in)

隱式Intent觸發(fā)是指向一個(gè)或者2個(gè)以上的Activity的目標(biāo)組件,它也可以沒(méi)有目標(biāo)Activity,它的隱式觸發(fā)用如下代碼表示:

Intent intent = new Intent();
intent.setPackage("com.xe.launchmode");
intent.setAction("com.xe.actoin.MAP");
intent.addCategory("android.intent.category.APP_MAPS");
MainActivity.this.startActivity(intent);

2、Service

Service是一種后臺(tái)處理任務(wù)型組件,它一直在后臺(tái)運(yùn)行,用于后臺(tái)處理一系列的計(jì)算任務(wù)或者處理其他事情的時(shí)候播放背景音樂(lè)等,每個(gè)service都擴(kuò)展自Service類(lèi);Service組件和Activity組件的開(kāi)啟是不同的,Activity只有一種啟動(dòng)狀態(tài),用如下代碼表示:

Intent in = new Intent(this,SecondActivity.class)
startActivity(in)

而Service的開(kāi)啟卻有2種,當(dāng)處于啟動(dòng)狀態(tài)時(shí),它可以做一些后臺(tái)任務(wù),不需要和用戶(hù)界面交互,它的生命周期和應(yīng)用程序一樣長(zhǎng),多媒體播放器播放音樂(lè)是應(yīng)用Service的一個(gè)非常好的例子。多媒體播放器程序可能包含一個(gè)或者多個(gè)Activity,用戶(hù)通過(guò)這些Activity選擇并播放音樂(lè)。然而音樂(lè)回放并不需要一個(gè)Activity來(lái)處理,因?yàn)橛脩?hù)可能會(huì)希望音樂(lè)一直播放下去,即使退出了播放器去執(zhí)行其他應(yīng)用程序也不停止。為了讓音樂(lè)一直播放,多媒體播放器Activity可能會(huì)啟動(dòng)一個(gè)Service在后臺(tái)播放音樂(lè)。Android系統(tǒng)會(huì)使音樂(lè)回放Service一直運(yùn)行,即使在啟動(dòng)這個(gè)Service的Activity退出之后。它的啟動(dòng)可用如下代碼表示:

Intent in = new Intent(this,SecondActivity.class)
MainActivity.this.startService(in)

當(dāng)它處于綁定狀態(tài)時(shí),它即可以做一些后臺(tái)任務(wù),也可以和用戶(hù)界面做交互,它的生命周期和用戶(hù)界面一樣長(zhǎng),它的綁定可用如下代碼表示:

ServiceConnection mBinderPoolConnection = new ServiceConnection() {
  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
   
  }

  @Override
  public void onServiceDisconnected(ComponentName name) {

  }
 };
 
Intent intent = new Intent(mContext, MyService.class); 
MainActivity.this.bindService(intent,new ServiceConnection(),Context.BIND_AUTO_CREATE);

以上2中開(kāi)啟,不管是哪一種都不可以直接在Service中做耗時(shí)操作,因?yàn)樗沁\(yùn)行在主線程中的,如果非要做耗時(shí)操作,應(yīng)該開(kāi)一個(gè)工作線程給它去執(zhí)行。

3、BroadcastReceiver

一般不執(zhí)行任何任務(wù),僅僅是接收并相應(yīng)廣播通知一類(lèi)的組件。大部分廣播通知是由系統(tǒng)產(chǎn)生的,例如改變時(shí)區(qū)、鬧鐘提醒、用戶(hù)選擇了一幅圖片或者用戶(hù)改變了語(yǔ)言首選項(xiàng)。應(yīng)用程序同樣也可以發(fā)送廣播通知,例如通知其他應(yīng)用程序某些數(shù)據(jù)已經(jīng)下載到設(shè)備上可以使用;一個(gè)應(yīng)用程序的BroadcastReceiver來(lái)響應(yīng)它的通知,所有的BroadcastReceiver的實(shí)現(xiàn)類(lèi)都擴(kuò)展自BroadcastReceiver類(lèi)。BroadcastReceiver適合用于不同的組件以及不同的進(jìn)程之間進(jìn)行通信,它是沒(méi)有用戶(hù)界面的,是因?yàn)樗谙到y(tǒng)內(nèi)部工作。下面介紹它的2種注冊(cè)方式,首先是靜態(tài)注冊(cè),它是在AndroidManifest.xml文件中完成的,安裝應(yīng)用時(shí)會(huì)被應(yīng)用解析,不啟動(dòng)應(yīng)用也能接收廣播,用如下監(jiān)聽(tīng)wifi狀態(tài)改變的代碼表示:

<receiver android:name=".myapplication.receiver.WifiReceiver">
 <intent-filter>
   <action android:name="android.net.wifi.RSSI_CHANGED" />
   <action android:name="android.net.wifi.STATE_CHANGE" />
   <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
  </intent-filter>
</receiver>

從以上代碼可以發(fā)現(xiàn),接收過(guò)程的匹配是通過(guò)<intent-filter>來(lái)描述的,可以總結(jié)出廣播是一個(gè)低耦合的觀察者模式這樣的結(jié)論。
另外一種方式就是動(dòng)態(tài)注冊(cè),需要啟動(dòng)應(yīng)用程序才可以接收到廣播,是通過(guò)在Java代碼中完成注冊(cè)的,用如下代碼表示它的動(dòng)態(tài)注冊(cè):

public class MyBroadcastReceiver extends BroadcastReceiver{
  @Override
  public void onReceive(Context context, Intent intent){
   
  }
 }
 
 
 MyBroadcastReceiver receiver = new MyBroadcastReceiver();
 IntentFilter filter=new IntentFilter();
 filter.addAction("com.xe.intent.action.ACTION_1");
 filter.addAction("com.xe.intent.action.ACTION_2");
 SecondActivity.this.registerReceiver(receiver,filter);

發(fā)送廣播可用如下代碼來(lái)實(shí)現(xiàn):

Intent intent = new Intent();
intent.setAction("com.xe.intent.action.ACTION_2");
MainActivity.this.sendBroadcast(intent);

以上2種廣播的注冊(cè)方式中廣播的接收是不可以做耗時(shí)操作的,因?yàn)榻邮諒V播的方法是在主線程中被調(diào)用的。

4、ContentProvider

ContentProvider是一種共享數(shù)據(jù)型組件,應(yīng)用程序可以通過(guò)ContentProvider來(lái)訪問(wèn)其他應(yīng)用程序的數(shù)據(jù),包括其他應(yīng)用程序的私有數(shù)據(jù);和Service一樣,它是沒(méi)有用戶(hù)界面的,它的內(nèi)部需要實(shí)現(xiàn)insert、update、delete和query方法,它在內(nèi)部使用一份數(shù)據(jù)集合并且對(duì)數(shù)據(jù)集合沒(méi)有要求。ContentProvider是跨進(jìn)程通信的,當(dāng)Android系統(tǒng)收到一個(gè)需求某個(gè)組件進(jìn)行處理的請(qǐng)求的時(shí)候,Android會(huì)確保處理此請(qǐng)求的組件的宿主進(jìn)程是否已經(jīng)在運(yùn)行,如果沒(méi)有,則立即啟動(dòng)這個(gè)進(jìn)程。ContentProvider是提供一個(gè)外部接口ContentResolver給其他進(jìn)程訪問(wèn)數(shù)據(jù)的,下面一部分代碼簡(jiǎn)單的表示query方法的使用過(guò)程:

Uri bookUri = Uri.parse("content://com.zyb.provider/data");
ContentResolver cr = ContentProviderActivity.this.getContentResolver();
Cursor bookCursor = cr.query(bookUri,new String[]{"_id","name"},null,null,null);
while (bookCursor.moveToNext()) {
 int id = bookCursor.getInt(0);
 String name = bookCursor.getString(1);
}

以上代碼,首先要?jiǎng)?chuàng)建要訪問(wèn)數(shù)據(jù)的Uri,然后通過(guò)應(yīng)用程序獲取ContentResolver接口,通過(guò)該接口獲取數(shù)據(jù)集合Cursor對(duì)象,最后通過(guò)Cursor對(duì)象查找索引獲取到最終所需的數(shù)據(jù)。好了,本章內(nèi)容就寫(xiě)到這里,由于本人技術(shù)有限,文章難免會(huì)出現(xiàn)錯(cuò)誤,還望批評(píng)指正;后面我會(huì)找個(gè)時(shí)間寫(xiě)一下Android四大組件工作過(guò)程的源碼分析,謝謝大家的閱讀。

以上就是詳解Android的應(yīng)用程序組件的詳細(xì)內(nèi)容,更多關(guān)于Android 應(yīng)用程序組件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論