用BroadcastReceiver控制Service

概述

通过在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;

}

}

}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值