startservice 方式开启服务 服务就会在后台长期运行 直到用户手工停止 或者调用StopService方法 服务才会被销毁
bindService 方式开启服务 当activity销毁的时候服务也销毁 不求同时生但求同时死
4.0以后。服务第一次启动必须有界面
电话窃听qi案例
new Thread(){}.start(); 服务有啥区别 股票应用 进程容易被杀死
实现步骤
(1)先定义一个服务 服务用来监听电话状态 开启服务
(2)在服务的oncreate方法里面实例化TelephoneManager类的实例
(3)注册一个电话监听
(4)定义一个电话监听的类 代码如下
//监听电话的状态
private class MyPhoneStateListenrer extends PhoneStateListener{
//当设备的状态发生改变的时候调用
@Override
public 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 {
@Override
public 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;
@Override
public IBinder onBind(Intent intent) {
return null;
}
//当服务第一次启动的时候调用
@Override
public 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();
}
//当服务销毁的时候调用
@Override
public void onDestroy() {
//当actvivity销毁的时候 取消注册广播接收者
unregisterReceiver(receiver);
super.onDestroy();
}
}
(3)一定要记得配置service