1. 為什么使用service
創(chuàng)新互聯(lián)企業(yè)建站,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),專(zhuān)注于網(wǎng)站建設(shè)技術(shù),精于網(wǎng)頁(yè)設(shè)計(jì),有多年建站和網(wǎng)站代運(yùn)營(yíng)經(jīng)驗(yàn),設(shè)計(jì)師為客戶(hù)打造網(wǎng)絡(luò)企業(yè)風(fēng)格,提供周到的建站售前咨詢(xún)和貼心的售后服務(wù)。對(duì)于網(wǎng)站設(shè)計(jì)、做網(wǎng)站中不同領(lǐng)域進(jìn)行深入了解和探索,創(chuàng)新互聯(lián)在網(wǎng)站建設(shè)中充分了解客戶(hù)行業(yè)的需求,以靈動(dòng)的思維在網(wǎng)頁(yè)中充分展現(xiàn),通過(guò)對(duì)客戶(hù)行業(yè)精準(zhǔn)市場(chǎng)調(diào)研,為客戶(hù)提供的解決方案。
應(yīng)用程序 : 一組組件(activity service provider receiver)的集合.
一般情況 一個(gè)應(yīng)用程序 會(huì)對(duì)應(yīng)一個(gè)進(jìn)程.
一般情況 關(guān)閉掉應(yīng)用, (關(guān)閉掉所有的界面 , 關(guān)閉所有的activity).
應(yīng)用程序的進(jìn)程 是不會(huì)被關(guān)閉掉的 仍然在后臺(tái)長(zhǎng)期的運(yùn)行.
采用一組策略 幫助我們自動(dòng)的管理進(jìn)程.
進(jìn)程 按照優(yōu)先級(jí)分為不同的等級(jí):
(1. 前臺(tái)進(jìn)程 用戶(hù)可以看到這個(gè)進(jìn)程里面某一個(gè)activity的界面. 可以操作這個(gè)界面
(2. 可見(jiàn)進(jìn)程 用戶(hù)仍然可以看到這個(gè)進(jìn)程 某個(gè)activity的界面 ,但是 不可以操作這個(gè)界面
(3. 服務(wù)進(jìn)程 如果一個(gè)應(yīng)用程序 有一個(gè)服務(wù)在后臺(tái)運(yùn)行
(4. 后臺(tái)進(jìn)程 沒(méi)有任何服務(wù)的進(jìn)程 打開(kāi)一個(gè)activity 之后 按了home鍵 最小化
(5. 空進(jìn)程 沒(méi)有任何活動(dòng)組件 存在的進(jìn)程.
2. 創(chuàng)建和使用service, 示例service×××電話(huà)
MainActivity.java , 開(kāi)啟一個(gè)service
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //開(kāi)啟服務(wù) Intent intent = new Intent(this,PhoneStatusService.class); startService(intent); } }
PhoneStatusService.java , 服務(wù)類(lèi)繼承自 Service
public class PhoneStatusService extends Service { /** * 長(zhǎng)期在后臺(tái)運(yùn)行的組件,如果用戶(hù)不手動(dòng)的關(guān)閉 , 不會(huì)停止的. */ @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { super.onCreate(); System.out.println("服務(wù)被創(chuàng)建了 "); // 監(jiān)視用戶(hù)電話(huà)狀態(tài)的變化... // 電話(huà)管理器 電話(huà)管理的服務(wù) TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); // ×××的通話(huà)狀態(tài)的變化 tm.listen(new MyPhoneStatusLinstener(), PhoneStateListener.LISTEN_CALL_STATE); } private class MyPhoneStatusLinstener extends PhoneStateListener { private MediaRecorder recorder; @Override public void onCallStateChanged(int state, String incomingNumber) { try { switch (state) { case TelephonyManager.CALL_STATE_IDLE: // 空閑狀態(tài) ,沒(méi)有通話(huà) 沒(méi)有響鈴 if (recorder != null) { recorder.stop(); recorder.reset(); // You can reuse the object by going back recorder.release(); // Now the object cannot be reused recorder = null; } break; case TelephonyManager.CALL_STATE_RINGING: // 響鈴狀態(tài). System.out.println("發(fā)現(xiàn)來(lái)電號(hào)碼 :" + incomingNumber); // 1.創(chuàng)建出來(lái)一個(gè)錄音機(jī) recorder = new MediaRecorder(); // 設(shè)置錄制的音頻源 從話(huà)筒里面獲取聲音 recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setOutputFile("/sdcard/" + System.currentTimeMillis() + ".3gp"); recorder.prepare(); break; case TelephonyManager.CALL_STATE_OFFHOOK: // 通話(huà)狀態(tài) if (recorder != null) { recorder.start(); // Recording is now started } break; } } catch (Exception e) { e.printStackTrace(); } super.onCallStateChanged(state, incomingNumber); } } @Override public void onDestroy() { super.onDestroy(); System.out.println("服務(wù)被銷(xiāo)毀了..."); } }
AndroidManifest.xml 注冊(cè)服務(wù)及權(quán)限獲取