通过在Service类的内部定义BroadcastReceiver对象,接收外部发送的广播,达到控制Service的目的。
步骤如下:
1、自定义Service的子类
2、在该Service子类中定义一个内部类,该类是BroadcastReceiver的子类
3、在Service类的onCreate方法中注册该广播接收者类,并设置action的值
4、在Activity中启动或绑定Service
5、在Activity中发送广播并传递数据,调用Service中的广播接收者的onReceive()方法
MyService.java
public class MyService extends Service { private String tag = "MyService"; @Override public IBinder onBind(Intent intent) { return null; } // 服务创建史执行,只会执行一次 public void onCreate() { try { Log.i(tag, "MyService onCreate()....."); MyReceiver myReceiver = new MyReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(Constant.ACTION_PALY); filter.addAction(Constant.ACTION_PAUSE); registerReceiver(myReceiver, filter); } catch (Exception e) { e.printStackTrace(); } } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(tag, "MyService onStartCommand()....."); return super.onStartCommand(intent, flags, startId); } public void play() { Log.i(tag, "my function Paly()...."); } public void pause() { Log.i(tag, "my function Pause()...."); } private class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.i(tag, intent.getAction()); try { if (Constant.ACTION_PALY.equals(intent.getAction())) { MyService.this.play(); } else if (Constant.ACTION_PAUSE.equals(intent.getAction())) { MyService.this.pause(); } } catch (Exception e) { e.printStackTrace(); } } } }
MainActivity.java
public class MainActivity extends Activity { Button paly, pause; Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { paly = (Button) findViewById(R.id.btn_paly); pause = (Button) findViewById(R.id.btn_pause); intent = new Intent(Constant.ACTION_MYSERVICE); startService(intent); paly.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { Log.i("MainActivity", "点击了Button_Play w .."); // Intent broadcast = new Intent(); // broadcast.setAction(Constant.ACTION_PALY); //或者用下面方法启动服务 intent.setAction(Constant.ACTION_PALY); sendBroadcast(intent); } catch (Exception e) { e.printStackTrace(); } } }); pause.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.i("MainActivity", "点击了Button_Pause .."); Intent broadcast = new Intent(); broadcast.setAction(Constant.ACTION_PAUSE); sendBroadcast(broadcast); } }); } catch (Exception e) { e.printStackTrace(); } } }
Constant.java提供常量
public class Constant { public static final String ACTION_PALY = "com.lydia.service.ACTION_PALY"; public static final String ACTION_PAUSE = "com.lydia.service.ACTION_PAUSE"; public static final String ACTION_MYSERVICE = "com.lydia.service.ACTION_MYSERVICE"; }
AndroidManifest.java中的配置
<service android:name=".MyService" > <intent-filter > <action android:name="com.lydia.service.ACTION_MYSERVICE"/> </intent-filter> </service>
测试结果:
启动程序便启动了Service,在启动Service的时候调用了MyService类中的onCreate()方法,该方法中注册了广播。当点击Button的时候,开始发送广播,广播发送后哦,MyReceiver类就会开始接收广播,调用onReceive()方法,根据intent.getAction()得到的Action的不同去执行不同的业务方法。