3.Service
Service
AIDL
Service两种启动方式:
1)startService():onCreate方法只调用一次,每次开启服务都会回调onStart方法,开启服务的进程被杀死后会自动重新启动,手动杀死不会重新启动。
2)bindService():onCreate,onBind,onUnbind,onDestroy只调用一次,只能绑定一次,绑定后只能解绑一次,可以通过定义的接口调用Service中的方法,绑定的Activity销毁,则Service关闭,可以通过混合开启Serivce使服务运行于后台。
AIDL接口用于远程服务的访问,需要在相同的包下面,是通过隐式启动来启动。
电话录音机:
监听电话状态要用TelephonyManager对象, 是一种系统服务,监听的事件是电话响铃状态,PhoneStateListener是一个类而非接口。录音使用的是MediaRecoder对象
TelephonyManager tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
tm.listen(new listener(),PhoneStateListener.LISTEN_CALL_STATE);
class listener extends PhoneStateListener{
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state){
case TelephonyManager.CALL_STATE_IDLE:
System.out.println("空闲");
if(recorder != null){
//录音停止
recorder.stop();
//释放资源
recorder.release();
recorder = null;
}
break;
case TelephonyManager.CALL_STATE_RINGING:
System.out.println("响铃");
if(recorder == null){
recorder = new MediaRecorder();
//设置录音源来自麦克风 recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置录音输出格式为3gp recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//设置录音输出文件
recorder.setOutputFile(getFilesDir() + "/" + "luyin.3gp");
//设置录音编码类型 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try{
//录音准备
recorder.prepare();
}catch (Exception e){
e.printStackTrace();
}
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
System.out.println("摘机");
if(recorder != null){
//开始录音
recorder.start();
}
break;
}
}
}
}
四、ContentProvider
ContentProvider
一般很少需要自定义ContentProvider,自定义ContentProvider的话,需要重写query,insert,update,delete等方法,分别返回Cursor,Uri,int类型的数据,这些方法在访问时通过ContentResolver对象调用,需要传入的参数包括Uri和相应方法所需要的参数,这个Uri标识了提供数据的ContentProvider,这个Uri是在清单文件中配置的android:authorities属性,Uri后面可以跟path,通过匹配Uri,用来区分对不同的数据表的操作,在修改过表的数据后,还要通过getContext().getContentResolver().notifyChange(uri,null);这样才能使ContentObserver观察到数据的变化。
访问ContentProvider通过ContentResolver调用相应方法,
使用ContentResolver为指定Uri注册一个ContentObserver派生类:getContentResolver.registerContentObserver(uri,notifyForDescendents,ContentObserver)