2018-2019-2 20189205《移動平臺應用開發實踐》第十二週做業

Android學習

服務

一個Android應用主要由四個基本組件組成,Android四大基本組件分別是Activity,Content Provider內容提供者,Service服務,BroadcastReceiver廣播接收器。
Services(服務)簡單來講就是剝奪界面的Activity。它和Activity不少概念都是類似的,都是封裝有一個完整的功能邏輯實現。
Services是運行在後臺的一段代碼,它能夠運行在它本身的進程,也能夠運行在其餘應用程序進程的上下文(context)裏面,其它的組件能夠綁定到一個服務(Service)上面,經過遠程過程調用(RPC)來調用這個方法。常見的Services如後臺音樂播放,後臺計算數據。android

運行原理

服務有兩種運行方式,原理以下:app

  • a、使用Context.startService()來啓動一個Service,從而能夠在後臺調用Service。同時,系統也將保持這個Service一直執行,直到這個Service運行結束。
  • b、使用Context.bindService()方法,鏈接到一個Service上(若是這個Service尚未運行將啓動它)。當鏈接到一個Service以後,咱們還能夠Service提供的接口與它進行通信。

生命週期

官方生命週期的圖示:
ide

  • a、startService後,即便調用startService的進程結束了,Service仍然還存在,直到有進程調用stopService,或者Service本身自殺(stopSelf())。
  • b、bindService後,Service就和調用bindService的進程同生共死了,也就是說當調用bindService的進程死了,那麼它bind的Service也要跟着被結束,固然期間也能夠調用unbindservice讓 Service結束。
  • c、兩種方式混合使用時,好比說你startService了,我bindService了,那麼只有你stopService了並且我也unbindservice了,這個Service纔會被結束。

使用步驟

a、繼承service類(位於android.app包下,通常用它的子類IntentService)學習

b、AndroidManifast.xml配置清單文件中 節點裏對服務進行配置
<service name=".XXXX"/>
c、服務不能本身運行,須要經過Contex.startService()或Contex.bindService()啓動服務
  經過startService()方法啓動的服務於調用者沒有關係,即便調用者關閉了,服務仍然運行想中止服務要調用Context.stopService(),此時系統會調用onDestory(),使用此方法啓動時,服務首次啓動系統先調用服務的onCreate()-->onStart(),若是服務已經啓動再次調用只會觸發onStart()方法使用bindService()啓動的服務與調用者綁定,只要調用者關閉服務就終止,使用此方法啓動時,服務首次啓動系統先調用服務的onCreate()-->onBind(),若是服務已經啓動再次調用不會再觸發這2個方法,調用者退出時系統會調用服務的onUnbind()-->onDestory(),想主動解除綁定可以使用Contex.unbindService(),系統依次調用onUnbind()-->onDestory();
區別使用 startService()仍是bindService()就要看是否要和調用者進行通訊,因爲startService()和訪問者不存在太多聯繫,全部有進行通訊的要用bindService()。經過Service提供IBinder OnBind(Intent intent) 返回要通訊的數據,在OnServiceConnected()方法 返回該Binder給調用者。
code

廣播接收器

廣播接收器用於響應來自其餘應用程序或者系統的廣播消息。這些消息有時被稱爲事件或者意圖。例如,應用程序能夠初始化廣播來讓其餘的應用程序知道一些數據已經被下載到設備,並能夠爲他們所用。這樣廣播接收器能夠定義適當的動做來攔截這些通訊。xml

有如下兩個重要的步驟來使系統的廣播意圖配合廣播接收器工做。對象

  • 建立廣播接收器
  • 註冊廣播接收器

建立廣播接收器

廣播接收器須要實現爲BroadcastReceiver類的子類,並重寫onReceive()方法來接收以Intent對象爲參數的消息。blog

public class MyReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
      Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
   }

註冊廣播接收器

應用程序經過在AndroidManifest.xml中註冊廣播接收器來監聽制定的廣播意圖。假設咱們將要註冊MyReceiver來監聽系統產生的ACTION_BOOT_COMPLETED事件。該事件由Android系統的啓動進程完成時發出。繼承

<application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <receiver android:name="MyReceiver">

      <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED">
         </action>
      </intent-filter>

   </receiver>
</application>

如今,不管何時Android設備被啓動,都將被廣播接收器MyReceiver所攔截,而且在onReceive()中實現的邏輯將被執行。接口

有許多系統產生的事件被定義爲類Intent中的靜態常量值。下面列舉了重要的系統事件。

  • android.intent.action.BATTERY_CHANGED 持久的廣播,包含電池的充電狀態,級別和其餘信息。
  • android.intent.action.BATTERY_LOW 標識設備的低電量條件。
  • android.intent.action.BATTERY_OKAY 標識電池在電量低以後,如今已經好了。
  • android.intent.action.BOOT_COMPLETED 在系統完成啓動後廣播一次。
  • android.intent.action.BUG_REPORT 顯示報告bug的活動。
  • android.intent.action.CALL 執行呼叫數據指定的某人。
  • android.intent.action.CALL_BUTTON 用戶點擊"呼叫"按鈕打開撥號器或者其餘撥號的合適界面。
  • android.intent.action.DATE_CHANGED 日期發生改變。
  • android.intent.action.REBOOT 設備重啓。
相關文章
相關標籤/搜索