Android四大组件的作用
一、Android四大組件
Android四大組件除了BroadcastReceiver以外,其他三種組件都必須在AndroidManifest中注冊,對于BroadcastReceiver來說,既可以在AndroidManifest中注冊,也可以通過代碼來注冊。在調用方式上,Activity、Service和BroadcastReceiver需要借助Intent,而ContentProvider無須借助Intent。
1、Activity
- Activity的作用 Activity是一種展示型組件,主要是向用戶展示一個界面,并且可以接收用戶的輸入信息從而和用戶進行交互。對用戶來說,Activity就是Android應用的全部,因為其他三大組件對用戶來說是不可感知的。 Activity的啟動由Intent觸發,其中Intent分為顯式啟動和隱式啟動。 Activity組件的主要作用是展示一個界面并和用戶交互,它扮演的是一種前臺界面的角色。
- Activity能否開啟多進程 Activity可以通過在AndroidManifest中通過添加android:process的屬性來開啟多進程。若該Activity需要被外界調用,則需要設置android:exported=true這個屬性。android:exported默認是false的,除非該Activity設置了Intent-Filter。設置了android:exported=true,同時也可以設置android:permission來限制外部應用調用。
2、Service
- Service的作用 Service是一種計算型組件,用于在后臺執行一系列計算任務。由于Service組件工作在后臺,因此用戶無法直接感知到它的存在。Service組件和Activity組件不同,Activity組件只有一種運行模式,即Activity處于啟動狀態,但是Service組件卻有兩種狀態:啟動狀態和綁定狀態。 Service組件處于啟動狀態時,它的內部可以執行一些后臺計算,并且不需要和外界有直接的交互。Service處于綁定狀態,Service內部同樣也可以執行后臺計算,但是處于這種狀態的Service可以很方便地和外界進行通信。 Service組件的主要作用是在后臺執行計算任務,執行任務的結果可以和外界進行通信。
- Service能否開啟多進程 Service可以通過在AndroidManifest中通過添加android:process的屬性來開啟多進程。若該Service需要被外界調用,則需要設置android:exported=true這個屬性。android:exported默認是false的,除非該Service設置了Intent-Filter。設置了android:exported=true,同時也可以設置android:permission來限制外部應用調用。
3、BroadcastReceiver
- BroadcastReceiver的作用 BroadcastReceiver是一種消息型組件,用于在不同組件乃至不同應用之間傳遞消息。BroadcastReceiver同樣無法被用戶所感知,因為它工作在系統內部。 BroadcastReceiver也叫做廣播,廣播的注冊方式有兩種:靜態注冊和動態注冊。靜態注冊指在AndroidManifest中注冊廣播,這種廣播在應用安裝時被系統解析,此種形式的廣播不需要應用啟動就可以接收到相應的廣播。動態廣播需要通過Context.registerReceiver()來實現,并且在不需要的時候通過Context.unRegisterReceiver()解除廣播,此種形態的廣播必須要應用啟動才能注冊并接收廣播。 BroadcastReceiver組件的主要作用是消息的傳遞,該消息的傳遞可以在應用內,也可以在應用之間,它的角色是一個消息的傳遞者。
- BroadcastReceiver能否開啟多進程 BroadcastReceiver可以通過在AndroidManifest中通過添加android:process的屬性來開啟多進程。若該BroadcastReceiver需要被外界調用,則需要設置android:exported=true這個屬性。android:exported默認是false的,除非該BroadcastReceiver設置了Intent-Filter。設置了android:exported=true,同時也可以設置android:permission來限制外部應用調用。
- 多應用調用BroadcastReceiver的例子 發送端代碼:
發送端代碼挺簡單的,就使用sendBroadcast發送一個Intent對象,其中的Intent對象的action名為“com.test.abc”,并且攜帶了key為“msg”,value為“hello world”的信息。注意sendBroadcast方法的第二個參數為"com.test.mypermission",其實第二個參數代表的是permission,也就是該廣播具有permission權限,當接收端的Receiver具有permission權限時,才能接收到該廣播。下面我們看一下接收端的代碼:
接收端代碼:
//自定義的一個廣播接收器 public class MyBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String msg = intent.getStringExtra("msg");Log.d("ABC", "msg from remote:" + msg);} }// AndroidManifest: <permissionandroid:name="com.test.mypermission"/> <!--聲明自定義權限--> <uses-permission android:name="com.test.mypermission"/> <!--引用自己聲明的權限--><receiverandroid:name=".MyBroadcastReceiver"android:exported="true"><intent-filter><action android:name="com.test.abc"/></intent-filter> </receiver>接收端的代碼邏輯分為三部分: 1、首先自定義一個廣播接收器,在onReceiver方法中接收發送端發過來的請求信息。 2、然后我們需要在AndroidManifest中注冊該廣播接收器,由于發送端和接收端屬于兩個不同的應用,所以需要聲明android:exported=true,并且添加action標簽,表明只接收action為"com.test.abc"的廣播。 3、最后由于發送端發送廣播時定義了一個permission權限,所以我們需要用標簽聲明該權限,并且用標簽引用該權限。
4、ContentProvider
- ContentProvider的作用 ContentProvider是一種數據共享型組件,用于向其他組件乃至其他應用共享數據。同樣的,它也無法被用戶所感知。 對于ContentProvider組件來說,它的內部需要實現增刪改查這四種操作。需要注意的是,ContentProvider內部的insert、delete、update和query方法需要處理好線程同步,因為這幾個方法都是在Binder線程池中被調用的。ContentProvider組件不需要手動停止。 ContentProvider組件的主要作用是作為一個平臺,提供數據的共享,并且提供數據的增刪改查功能。主要應用于應用之間的數據共享場景。
- ContentProvider是否可以開啟多進程 ContentProvider可以通過在AndroidManifest中通過添加android:process的屬性來開啟多進程。若該ContentProvider需要被外界調用,則需要設置android:exported=true這個屬性。當android sdk的minSdkVersion或者targetSdkVersion為16或者以下時,android:exported默認是true的。當android sdk的minSdkVersion或者targetSdkVersion為17或者以上時,android:exported默認是false。設置了android:exported=true,同時也可以設置android:permission來限制外部應用調用。
二、參考文檔
- 《Android開發藝術探索》
- android:exported 屬性詳解
總結
以上是生活随笔為你收集整理的Android四大组件的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA多线程程序ProgressBar
- 下一篇: java console 到文件