好久沒有寫有關android有關的博客了,今天主要來談一談android中四大組件。首先,接觸android的人,都應該知道android中有四大組件,activity,service,broadcast receiver,content provider,簡單的翻譯就是頁面,服務,廣播,和內容提供者。
activity:activity指的是app中的每一個頁面,他是整個項目最基本的組成部分,一個項目就是有很多很多個activity組成的,activity顯示的內容可以分為兩種聲明方式,第一種是通過XML配置文件來聲明,第二中就是繼承view的對象。
1.通過XML文件來配置,我們在項目中沒創建一個activity,如果使用android studio來開發的話,系統會自己幫在配置文件中配置好,使用eclipse的話,則需要手動進行配置。
2.繼承字view來聲明:這種聲明模式我們一般是自定義的時候我們用的比較多,這種靈活性比較好,復用性比較強耦合性比較強。
說到activity,那必須得談一談activity的生命周期了,activity的生命周期有以下的這些(手打出來的,大小寫不要在意)oncreate(),onstart(),onresume(),onpause(),onstop(),onrestart(),ondestroy() .
這七個方法就包含了整個頁面從開始創建到銷毀。當頁面開始創建出來的時候,系統會掉用oncreate()這個方法,接着就會掉用onstart()方法,這個時候我們是看不到這個頁面的,當我們看到這個頁面的時候,也可以說頁面獲得焦點的時候,就會掉用onresume(),當頁面可見,但是失去焦點的時候,系統就會掉用的是onpause(),什么是失去焦點?舉個例子,頁面中彈出一個對話框,我們可以看到這個頁面,但是我們不能對這個頁面進行操作,這個時候就是說頁面失去了焦點。onstop()這個方法,翻譯過來就是停止,當一個頁面被另一個頁面覆蓋的時候,就是看不到這個頁面的時候,這個頁面就會掉用onstop(),這個方法,那什么時候會掉用ondestroy()這個方法呢,當我們手動進行銷毀這個頁面的時候,比如我們掉用finish()方法的時候,系統就會掉用ondestroy()方法,但是,這不是絕對的,很多時候系統也會掉用ondestroy()方法,比如猶豫我們代碼出現問題,內存溢出啊,或者是內存泄漏啊什么的,導致程序崩潰,也會掉用ondestroy()方法。
service:android四大組件之一的service,服務是在后台上運行的,所以並沒有一個可視化的界面,所以當應用程序需要進行某種不需要前台顯示的計算或者數據處理時,就可以使用這個service。service一般由activity或者其他對象來進行啟動的,當啟動service之后,即便啟動他的組件的生命周期已經結束,但是該service仍然繼續運行,知道自己的生命周期結束。
當然service不同的啟動方式,他的生命周期也是不同的。
1:通過startservice方式啟動,當系統調用startservice方法時,如果該service還未啟動,則會掉用其oncreate()方法和on start()方法.當其他的context對象調用stopservice()方法或者是service本身掉用自身的stopSelf或者stopservice()方法時才會停止。
2:通過bindService方法啟動服務,當系統調用bindService方法時,如果該service還未啟動,則會調用其oncreate方法,然后會將service和context對象進行綁定,當組件銷毀的時候,service也會跟着銷毀。
broadcast Receiver組件:
broadcast Receiver——廣播,廣播有兩種注冊方式,一種是靜態注冊,另一種是動態注冊;
靜態注冊:這種注冊方式可以使得應用程序安裝之后,Broadcast Receiver始終處於活動的狀態,通常用於監聽系統狀態的改變,比如說電量不足,網絡狀況,Wi-Fi情況等等。這種注冊方式我們主要是在在AndroidManifest.xml中注冊,比如:
<receiver android:name=".MyReceiver">
<intent-filter >
<action android:name="myaction"/>
</intent-filter>
</receiver>
動態注冊:這種注冊方式就靈活的多了,這中注冊方式直接就在activity中進行注冊,通常來說這樣注冊的Broadcast Receiver通常是用於更新ui的狀態,一般來說,都是一個activity在啟動的時候使用這樣的方法注冊Broadcast Receiver,一旦接受到了廣播的事件,就可以在onReceiver方法中更新當前的這個控件,但是需要注意到的是如果這個activity不可見了,就應該unregisterReceiver方法來解除注冊;
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("myaction");
registerReceiver(receiver, filter);
Content Provider組件:
Content Provider組件主要用於不同應用程序之間進行數據共享。
下面說一說應用程序的內部通信
內部程序通信是簡單來講是指線程和自己開發的子線程之間的通信,在android應用程序運行時,默認情況下會成為第一個啟動的組件創建一個進程,之后啟動的組件都運行在這個進程中。
通常,主線程和子線程之間的通信,我們用的最多的就是handler,應用程序在主線程中維護一個消息隊列,handler機制使得線程間的通信通過message和Runnable對象來傳遞和處理。
(1)傳遞消息對象
使用handler傳遞消息時將消息封裝到一個message對象中,message類中包涵了消息的描述和任何形式的可以被handler發送的數據對象,通常,一個message對象中的字段有下面的子段:
| Arg1 |
Int類型,當傳遞的消息只包含整數時,可以填充該字段以降低成本,該字段可以通過成員方法setData和getData方法訪問或修改 |
arg2
obj object類型
what int 類型,有用戶定義的消息類型碼,接收方根據該字段來判斷消息。
| 方法名 |
說明 |
| sendEmptyMessage(int what) |
發送一個空消息 |
| sendMessage(Message message) |
發送一個消息對象 |
| sendMessageAtTime(Message me,long time) |
在指定時間之前發送 |
| sendMessageDelayed(Message me.long time) |
在指定時間間隔之后發送 |
敲了着么久,好累,先休息會,下次再更。
