service 组件,和UI并不进行交互,运行在后台,可以和其他组件进行交互
broadcastreceiver,广播是一种广泛运用的在应用程序之间传输信息的机制 。而 BroadcastReceiver 是对发送出来的广播进行过滤接收并响应的一类组件
intentfilter Intent类似于Windows中的消息,而intentfilter可以理解为消息过滤器
下面我们用例子来说明如何运用这三种组件
首先,我们建立一个Serivce,他的作用是每间隔一秒生成一个随机数,并将随机数放到Intent中
然后声明一个action,在Service中进行广播,在MainActivity中来接收这个广播,并显示随机数.
为了可以使服务停止,我们另外建立了一个BroadCastReceiver 来接受广播,当判断广播内容是停止服务时,调用停止服务.
在服务的onCreate中,注册广播接收器组件,在onDestory中取消注册广播接收组件
在onStartCommand中声明了一个IntentFilter用来过滤广播消息,设定Action
先来看下Service和停止服务用的BroadCastReceiver
package com.ssln.broadcastreceiver_service_intentfilter;import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.IBinder;import android.util.Log;public class MyService extends Service { public final static int CMD_STOP_SERVICE=1; //停止服务 private CommandReciver cmdReceiver; private boolean flag; public final static String action="com.ssln.broadcastreceiver_service_intentfilter.MyService"; private static final String TAG = "MyService"; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { flag = true; cmdReceiver = new CommandReciver(); super.onCreate(); Log.i(TAG, "MyService-->onCreate"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, "MyService-->onStartCommand"); IntentFilter filter = new IntentFilter(); // 建立IntentFilter对象 filter.addAction(action); // 注册广播接收,并设置接受的action registerReceiver(cmdReceiver, filter); Log.i(TAG, "MyService-->注册BroadcastReceiver成功"); // 启动线程 doJob(); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { Log.i(TAG, "MyService-->onDestroy"); // 取消广播接受的注册 unregisterReceiver(cmdReceiver); Log.i(TAG, "MyService-->取消注册BroadcastReceiver成功"); super.onDestroy(); } /** * 执行线程 */ private void doJob() { new Thread() { public void run() { while (flag) { try { Thread.sleep(1000);// 睡眠一秒 } catch (Exception exp) { exp.printStackTrace(); } Intent intent=new Intent(); //设置action intent.setAction(action); //设置随机数 intent.putExtra("data", Math.random()); //发送广播 sendBroadcast(intent); Log.i(TAG, "MyService-->doJob"); } } }.start(); } /** * 为了Service的停止,为Service注册Broadcast Receiver组件 * @author ssln * */ private class CommandReciver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int cmd=intent.getExtras().getInt("cmd",-1); if(cmd==CMD_STOP_SERVICE){ //停止线程 flag=false; //停止服务 stopSelf(); } } }}
在来看看MainActivity.java
在onclick中,我们看到btnStart是启动了我们自定义的服务,而btnStop是发送了一个停止服务的广播内容
package com.ssln.broadcastreceiver_service_intentfilter;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity implements OnClickListener{ private static final String TAG = "MainActivity"; private TextView tvData; private Button btnStart,btnStop; private DataReceiver datareceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvData=(TextView)findViewById(R.id.tvData); btnStart=(Button)findViewById(R.id.btnStart); btnStop=(Button)findViewById(R.id.btnStop); btnStart.setOnClickListener(this); btnStop.setOnClickListener(this); } /** * 注册广播接收 */ private void RegDataReceiver() { if(datareceiver==null) { //注册action datareceiver=new DataReceiver(); IntentFilter filter=new IntentFilter(); //添加接受的action filter.addAction(MyService.action); //注册 registerReceiver(datareceiver, filter); Log.i(TAG, "注册广播成功"); } } /** * 取消注册 */ private void UnRegDataReceiver() { if(datareceiver!=null) { unregisterReceiver(datareceiver); datareceiver=null; Log.i(TAG, "取消注册广播"); } } @Override protected void onResume() { RegDataReceiver(); Log.i(TAG, "onResume"); super.onResume(); } @Override protected void onPause() { UnRegDataReceiver(); Log.i(TAG, "onPause"); super.onPause(); } /** * 接受线程发送过来的数据 * @author ssln * */ private class DataReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { double data=intent.getDoubleExtra("data", 0.0d); if(data==0) { int cmd=intent.getIntExtra("cmd", -1); if(cmd==MyService.CMD_STOP_SERVICE) tvData.setText("停止服务成功"); else tvData.setText("未知数据"); } else { tvData.setText("Service 发送的数据为: "+String.valueOf(data)); } } } @Override public void onClick(View v) { if(v==btnStart) { Intent myIntent=new Intent(MainActivity.this,MyService.class); startService(myIntent); tvData.setText("启动服务成功 "); } else if(v==btnStop) { Intent myIntent=new Intent(); myIntent.setAction(MyService.action); myIntent.putExtra("cmd", MyService.CMD_STOP_SERVICE); sendBroadcast(myIntent); } }}
activity_main.xml
最后,记得在AndroidManifest.xml中注册我们的服务,否则启动不了的啊
看下效果,每秒生成的随机数都不同
我们点击停止后,会停止服务