startservice 方式开启服务 服务就会在后台长期运行 直到用户手工停止 或者调用StopService方法 服务才会被销毁
bindService 方式开启服务 当activity销毁的时候服务也销毁 不求同时生但求同时死
4.0以后。服务第一次启动必须有界面
电话窃听qi案例
new Thread(){}.start(); 服务有啥区别 股票应用 进程容易被杀死
实现步骤
(1)先定义一个服务 服务用来监听电话状态 开启服务
(2)在服务的oncreate方法里面实例化TelephoneManager类的实例
(3)注册一个电话监听
(4)定义一个电话监听的类 代码如下
//监听电话的状态private class MyPhoneStateListenrer extends PhoneStateListener{//当设备的状态发生改变的时候调用@Overridepublic void onCallStateChanged(int state, String incomingNumber) {//[3]具体判断一下 电话是处于什么状态switch (state) {case TelephonyManager.CALL_STATE_IDLE: //空闲状态break;case TelephonyManager.CALL_STATE_OFFHOOK://接听状态System.out.println("开始录");break;case TelephonyManager.CALL_STATE_RINGING: //响铃状态System.out.println("我准备一个录音机出来 ");break;}super.onCallStateChanged(state, incomingNumber);}}
(5) 实现录音的功能
//[1]获取MediaRecorder类的实例recorder = new MediaRecorder();//[2]设置音频的来源recorder.setAudioSource(MediaRecorder.AudioSource.MIC); //zet//[3]设置音频的输出格式recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//[4]设置音频的编码方式recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//[5]保存的文件路径recorder.setOutputFile("/mnt/sdcard/luyin.3gp");//[5]准备录音try {recorder.prepare();} catch (IllegalStateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}
(6)记得加上相应的权限
<uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.RECORD_AUDIO" /><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
在Android 3.1系统之后,静态广播默认会被后台回收掉的。因此,静态广播多数是不安全的,所以建议建立动态广播,并且与Service进行绑定,这样做有利于长时间的后台监听。在Activity中注册广播接收者建议在onResume()当中进行注册。在onDestroy()进行销毁。
使用服务注册特殊的广播接收者
(1)创建我们要注册的广播接收者
public class ScreenReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//获取广播事件的类型String action = intent.getAction();if ("android.intent.action.SCREEN_OFF".equals(action)) {System.out.println("说明屏幕锁屏了");}else if("android.intent.action.SCREEN_ON".equals(action)){System.out.println("说明屏幕解锁了");}}}
(2)创建一个服务 用来注册广播接收者 代码如下
package com.itheima.registerbroadcast;import android.app.Service;import android.content.Intent;import android.content.IntentFilter;import android.os.IBinder;public class ScreenService extends Service {private ScreenReceiver receiver;@Overridepublic IBinder onBind(Intent intent) {return null;}//当服务第一次启动的时候调用@Overridepublic void onCreate() {//在这个方法里面注册广播接收者//[1]获取ScreenReceiver实例receiver = new ScreenReceiver();//[2]创建IntentFilter对象IntentFilter filter = new IntentFilter();//[3]添加注册的事件filter.addAction("android.intent.action.SCREEN_OFF");filter.addAction("android.intent.action.SCREEN_ON");//[4]通过代码的方式注册registerReceiver(receiver, filter);super.onCreate();}//当服务销毁的时候调用@Overridepublic void onDestroy() {//当actvivity销毁的时候 取消注册广播接收者unregisterReceiver(receiver);super.onDestroy();}}
(3)一定要记得配置service