Android -- service 服务的创建与使用,生命周期,电话监控器
1. 为什么使用service
应用程序 : 一组组件(activity service provider receiver)的集合.
一般情况 一个应用程序 会对应一个进程.
一般情况 关闭掉应用, (关闭掉所有的界面 , 关闭所有的activity).
应用程序的进程 是不会被关闭掉的 仍然在后台长期的运行.
采用一组策略 帮助我们自动的管理进程.
进程 按照优先级分为不同的等级:
(1. 前台进程 用户可以看到这个进程里面某一个activity的界面. 可以操作这个界面
(2. 可见进程 用户仍然可以看到这个进程 某个activity的界面 ,但是 不可以操作这个界面
(3. 服务进程 如果一个应用程序 有一个服务在后台运行
(4. 后台进程 没有任何服务的进程 打开一个activity 之后 按了home键 最小化
(5. 空进程 没有任何活动组件 存在的进程.
2. 示例: 服务开启一个电话监控器
MainActivity.java 开启服务
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //开启服务 Intent intent = new Intent(this,PhoneStatusService.class); startService(intent); } }
PhoneStatusService.java 服务代码 继承自Service
public class PhoneStatusService extends Service { /** * 长期在后台运行的组件,如果用户不手动的关闭 , 不会停止的. */ @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { super.onCreate(); System.out.println("服务被创建了 "); // 监视用户电话状态的变化... // 电话管理器 电话管理的服务 TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); // 监听手机的通话状态的变化 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: // 空闲状态 ,没有通话 没有响铃 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: // 响铃状态. System.out.println("发现来电号码 :" + incomingNumber); // 1.创建出来一个录音机 recorder = new MediaRecorder(); // 设置录制的音频源 从话筒里面获取声音 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: // 通话状态 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("服务被销毁了..."); } }
AndroidManifest.xml 注册服务 和 所需权限
<?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>