1. 程式人生 > android教程 > android之旅17 四大元件之服務基本概念

android之旅17 四大元件之服務基本概念

  • 服務可以理解為沒有介面的Activity,用法也很像
  • 試用適合在後臺執行的程式碼,比如下載和播放音樂等
  • 之前的下載程式碼放在Activity其實也是可以的,因為無論按返回鍵還是HOME鍵(區別是Activity會不會呼叫destroy方法),程序還是在的;但記憶體不足的時候,Activity程序會被殺死,導致後臺下載任務無法執行,這也是服務的價值所在
  • 程序優先順序:Empty process(沒有Activity,比如APP啟動後按了返回鍵onDestroy) < background process(有Activity但不可見,比如APP啟動後按了HOME鍵 onStop) < Service process(startService啟動服務,一旦記憶體又有空閒還會重啟)
<application> <service android:name="packageName.MyService"> -- 顯式配置 <service></application> public class MyService extends Service{ ....}//系統自動殺死的服務會自動重啟,但使用者手動的不會public void click(View v){//顯式啟動服務 Intent intent = new Intent(this, MyService.class); startService(intent);//開啟服務 stopService(intent);//關閉服務,程式關閉的服務不會自己重啟}
  • 服務生命週期方法
  • onStartCommand,老版本叫onStart,但已經廢棄了,事實上內部還是呼叫onStart方法,在onCreate之後呼叫,每次嘗試啟動服務(startService方法呼叫)都會呼叫
  • onCreate建立服務的時候呼叫,只會呼叫一次,服務啟動會就不會呼叫,因此係統內部服務同一個服務只會建立一次
  • onDestroy服務銷燬的時候呼叫
電話錄音機
  • 電話狀態機:空閒狀態、響鈴狀態、摘機狀態
  • 注意許可權
  • 模擬器可能會有bug,前面錄不到,真機沒這個問題不用管
public class RecorderService extends Service{ public void onCreate(){ super.onCreate(); TelephonyManager tm = getSystemService(TELEPHONY_SERVICE); // 列舉確定監聽哪個狀態,在MyListener裡面就複寫哪個函式 tm.listen(newMyListener(), PhoneStateListener.LISTEN_CALL_STATE); }}public MyListener extends PhoneStateListener{ public void onCallStateChanged(int state, String incoming){ super.onCallStateChanged(state, incoming); switch(state){ case TelephonyManager.CALL_STATE_IDLE: case TelephonyManager.CALL_STATE_RING: //錄音邏輯。。。谷歌給了例子,照抄就可以。見下圖 break; case TelephonyManager.CALL_STATE_OFFHOOK: } }}

android之旅17 四大元件之服務基本概念