溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android -- service 服務(wù)的創(chuàng)建與使用,生命周期

發(fā)布時間:2020-08-08 18:36:28 來源:網(wǎng)絡(luò) 閱讀:318 作者:xj626852095 欄目:移動開發(fā)

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>

 

向AI問一下細節(jié)

免責(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)容。

AI