我们知道,Android有四大组件,分别是Activity,Content Provider , Broadcast Receiver 和今天我们要用到的Service。
我们说Service是看不见摸不着的,是因为它对用户是不可见的,Service作为四大组件之一,它的职责是工作在后台,处理
一些比较耗时的操作(如下载,播放媒体文件,检测版本更新和日志输出等)。
就像学习Activity组件一样,要想熟悉Service,必须知道它的整个工作流程,即它的生命周期(Life-cycle),下面是官网给
出的一个具体图例:
从图例我们可以知道,Service有两种启动方式,第一种是调用Context.startService()方法,
另外一种是调用Context.bindService().
对于第一种调用方法,系统会先调用onCreate()方法,负责初始化工作,然后调用onStart()方法,
启动Service,如果程序显示调用Context.stopService()方法或者Service自身调用stopSelf()方法
或者stopSelfResult()方法,都会调用onDestroy()方法,结束该服务,另外需要注意的是,调用者
和Service是没有关联的,也就是说,如果调用者退出了,并不会影响服务的运行。
对于第二种方式,调用方法是Context.bindService(),系统会先调用onCreate()方法,然后调用onBind()
方法,和调用者绑定,如果调用者退出,服务会调用onDestroy()方法结束自己的运行。
学完了一个东西,如果趁热打铁,自己编写一个demo,肯定会加深对该知识点的理解。
废话少说,下面给出一个电话录音的例子:
首先,也是最重要的,关于权限的声明:
<!-- 电话状态监听权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 开机广播权限 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- 音频刻录权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 写入权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
接下来是编写一个简单的Activity,用来启动Broadcast Receiver组件。
package com.example.service_record_call;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent receiver = new Intent("zjut.tsw.receiver");
this.sendBroadcast(receiver);
}
}
然后是编写一个简单的Broadcast Receiver,负责启动Service
package com.example.service_record_call;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context,PhoneListenerService.class);
context.startService(service);
}
}
接下来是编写核心Service.
package com.example.service_record_call;
import java.io.File;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
public class PhoneListenerService extends Service {
private final String TAG = "PhoneListenerService";
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(new TeleListine(), PhoneStateListener.LISTEN_CALL_STATE);
Log.i(TAG,"onCreate");
super.onCreate();
}
private class TeleListine extends PhoneStateListener {
private String mobile; //来电电话
private MediaRecorder recorder; //多媒体刻录文件
private File autoFile; //保存文件
private boolean recoder; //是否刻录
@Override
public void onCallStateChanged(int state,String incomingNumber) {
try{
switch(state) {
case TelephonyManager.CALL_STATE_IDLE :
if(recoder) {
recorder.stop();
recorder.release();
recoder = false;
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK :
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC); //这里只是录制自己的声音,如果想录制双方的通话声音,可改用MediaRecorder.AudioSource.VOICE_CALL
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
String root_directory = Environment.getExternalStorageDirectory() + "/recorded_calls";
File root_file = new File(root_directory);
if(!root_file.exists()) {
root_file.mkdir();
}
String record_call = root_directory + "/" + mobile + "_" + System.currentTimeMillis() + ".3gp";
File autoFile = new File(record_call);
if(!autoFile.exists()) {
autoFile.createNewFile();
}
//autoFile = new File(getCacheDir(),mobile+ "_" + System.currentTimeMillis() + ".3gp");
recorder.setOutputFile(autoFile.getAbsolutePath());
recorder.prepare();
recorder.start();
recoder = true;
Log.i(TAG,"接起电话");
break;
case TelephonyManager.CALL_STATE_RINGING :
mobile = incomingNumber;
Log.i(TAG,"mobile=" + mobile);
break;
default :
break;
}
}catch(Exception e) {
Log.i(TAG,e.toString());
e.printStackTrace();
}
super.onCallStateChanged(state, incomingNumber);
}
}
}
别忘了在AndroidManifest.xml中注册组件Service和Broadcast Receiver
<receiver android:name=".MyBroadcastReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="zjut.tsw.receiver" />
</intent-filter>
</receiver>
<service android:name=".PhoneListenerService" >
</service>
这样,当您打开了该软件,或者开机后,该服务会自动启动并运行(你可以在Android机上按Menu键->设置->应用程序->运行的服务 查看该服务的具体状态)
当有人打电话给你或者你打给别人,电话录音会保存在/recorded_calls/...里面。(该程序含有潜在的错误,如果通话时间足够多或足够长(煲电话粥的同志们注意了哦),可能会导致SD卡内存不足)
有需要源码的请Click:http://download.csdn.net/detail/czjuttsw/4700525
Over...