概述
通过在Service类的内部定义BroadcastReceiver对象,接收外部发送的广播,也可以达到控制Service的目的。
操作步骤
步骤1、自定义Service的子类。
步骤2、在该类中定义一个内部类,该类是BroadcastReceiver类的子类。
步骤3、在Service类的onCreate方法中注册该广播接收者类,并设置action值。
步骤4、在Activity中启动或绑定Service。
步骤5、在Activity中发送广播并传递数据,让Service中的广播接收者收到广播,根
据接收到的数据执行不同的业务逻辑代码。
示例
创建项目exer11_02,在该类中创建MyService类,该类是Service的子类,在该类中定义一个
内部类,该内部类是BroadcastReceiver的子类。
图-5
在MainAct中首先启动Service类,然后向该类发送两个广播,第一个广播是play,在日志窗口中将
显示图-5中红框中的第一行信息,显示Service中定义的play方法被调用。
第二个广播是pause,在日志窗口中将显示图-5红框中的第二行信息,显示Service中定义的pause方法被调用。
步骤1、创建布局界面,该段代码省略。
步骤2、创建Constant.java类,该类是一个工具类,存放播放与暂停两个动作的Action的值,代码如下所示:
package com.tarena.exer11_02;
public class Constant {
public static final String ACTION_PLAY="com.tarena.exer11_02.ACTION_PLAY";
public static final String ACTION_PAUSE="com.tarena.exer11_02.ACTION_PAUSE";
public static final String ACTION_MYSERVICE=
"com.tarena.exer11_02.ACTION_MYSERVICE";
}
步骤3、创建MyService.java类,该类继承自Service类,代码如下所示:
public class MyService extends Service {
private String tag="MyService";//日志窗口中输出的标签
//因不涉及绑定,所以onBind方法返回的对象为null
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
//服务创建时调用本方法
@Override
public void onCreate() {
super.onCreate();
Log.i(tag,"MyService onCreate()");
//以下创建并注册一个广播接收者对象
MyReceiver myReceiver=new MyReceiver();
//以下三行代码设置两个Action值
IntentFilter filter=new IntentFilter();
filter.addAction(Constant.ACTION_PAUSE);
filter.addAction(Constant.ACTION_PLAY);
registerReceiver(myReceiver, filter);//用代码的方式向系统注册
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(tag,"MyService onStartCommand()");
return super.onStartCommand(intent, flags, startId);
}
//自定义方法
private void play(){
Log.i(tag,"MyService play()");
}
//自定义 方法
private void pause(){
Log.i(tag,"MyService pause()");
}
//自定义广播接收者类
private class MyReceiver extends BroadcastReceiver{
//在收到广播时触发本方法
@Override
public void onReceive(Context context, Intent intent) {
//若Action的值Constant.ACTION_PLAY,则调用play()
if(Constant.ACTION_PLAY.equals(intent.getAction())){
MyService.this.play();
//若Action的值是Constant.ACTION_PAUSE,则调用pause()
}else if(Constant.ACTION_PAUSE.equals(intent.getAction())){
MyService.this.pause();
}
}
}
}
步骤4、以下是MainAct.java类的代码,该代码负责启动Service并向Service发送两种类型的广播。
public class MainAct extends Activity implements OnClickListener{
Intent mIntent;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnPlay=(Button)findViewById(R.id.btnPlay);
Button btnPause=(Button)findViewById(R.id.btnPause);
btnPause.setOnClickListener(this);
btnPlay.setOnClickListener(this);
//启动Service
mIntent=new Intent(Constant.ACTION_MYSERVICE);
startService(mIntent);
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btnPlay://播放按钮
//发送action值是Constant.ACTION_PLAY的广播
mIntent.setAction(Constant.ACTION_PLAY);
sendBroadcast(mIntent);
break;
case R.id.btnPause:
//发送action值是Constant.ACTION_PAUSE的广播
mIntent.setAction(Constant.ACTION_PAUSE);
sendBroadcast(mIntent);
break;
}
}
}