我们知道,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" />
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); } }
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); } }
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); } } }
<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>
当有人打电话给你或者你打给别人,电话录音会保存在/recorded_calls/...里面。(该程序含有潜在的错误,如果通话时间足够多或足够长(煲电话粥的同志们注意了哦),可能会导致SD卡内存不足)
有需要源码的请Click:http://download.csdn.net/detail/czjuttsw/4700525
Over...