您好,登錄后才能下訂單哦!
1. 為什么使用service
應(yīng)用程序 : 一組組件(activity service provider receiver)的集合.
一般情況 一個應(yīng)用程序 會對應(yīng)一個進程.
一般情況 關(guān)閉掉應(yīng)用, (關(guān)閉掉所有的界面 , 關(guān)閉所有的activity).
應(yīng)用程序的進程 是不會被關(guān)閉掉的 仍然在后臺長期的運行.
采用一組策略 幫助我們自動的管理進程.
進程 按照優(yōu)先級分為不同的等級:
(1. 前臺進程 用戶可以看到這個進程里面某一個activity的界面. 可以操作這個界面
(2. 可見進程 用戶仍然可以看到這個進程 某個activity的界面 ,但是 不可以操作這個界面
(3. 服務(wù)進程 如果一個應(yīng)用程序 有一個服務(wù)在后臺運行
(4. 后臺進程 沒有任何服務(wù)的進程 打開一個activity 之后 按了home鍵 最小化
(5. 空進程 沒有任何活動組件 存在的進程.
2. 創(chuàng)建和使用service, 示例service×××電話
MainActivity.java , 開啟一個service
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //開啟服務(wù) Intent intent = new Intent(this,PhoneStatusService.class); startService(intent); } }
PhoneStatusService.java , 服務(wù)類繼承自 Service
public class PhoneStatusService extends Service { /** * 長期在后臺運行的組件,如果用戶不手動的關(guān)閉 , 不會停止的. */ @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)視用戶電話狀態(tài)的變化... // 電話管理器 電話管理的服務(wù) TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); // ×××的通話狀態(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) ,沒有通話 沒有響鈴 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)來電號碼 :" + incomingNumber); // 1.創(chuàng)建出來一個錄音機 recorder = new MediaRecorder(); // 設(shè)置錄制的音頻源 從話筒里面獲取聲音 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: // 通話狀態(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ù)被銷毀了..."); } }
AndroidManifest.xml 注冊服務(wù)及權(quán)限獲取
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.itheima.callstatuslintener" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.itheima.callstatuslintener.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".PhoneStatusService"></service> </application> </manifest>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。