Android中Activity与Service通信——Broadcast、Receiver、Intent、Bundle

有些事情一直强调,一直不去遵守,到了某个时候,结果它自己成为了习惯。很不明白,就像小时候那么爱玩台球,怎么给自己施加压力还是不行;后来迷上了电脑、网络,居然就把台球给忽略了,想好好读书,还是天天跑网吧;到了大学有自己的电脑居然没怎么去过网吧了;真是奇怪的事情;O(∩_∩)O~什么时候记录这事情也能成为一种习惯,每当做完一些事情的时候就写,而不是总是找借口忙啊忙的......
今天主要说明的是Activity(或者其中的View,通过传递Context即可)怎么与Service不断地交互信息;如果只是一开始的传递数据,完全可以通过在创建Service前通过Intent配合Bundle传递;如果需要来回交换一些状态信息或者动作命令(Action),则可以利用Broadcast和Receiver来实现。

Activity和Service都有自己的生命周期,当Activity退出时,Service仍可以在后台默默服务。这里就简单介绍一个例子,Activity通过按钮点击发送不同的动作命令给Service执行。而Service再通过广播返回信息类似。

在Activity的代码中,可以有如下语句:

1.首先是创建Service

Intent i = new Intent(this, MyService.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra("RunFlag", mbRunFlag);
startService(i);
如果从Activity传递的是简单数据类型,Intent中提供的非常全,如果是自定义类,可以通过Bundle来实现,下面有用到。其中,MyService继承自Service,里面实现了onStart()时所做的接收工作如下:

	  @Override
	  public void onStart(Intent intent, int startId)
	  {
	    // TODO Auto-generated method stub	    
	    mbRunFlag = intent.getLongExtra("RunFlag", mbRunFlag);
	    IntentFilter filter = new IntentFilter(SERVICE_COMMAND);
	    //下面是开启的对广播的接收处理工作
	    mReceiver = new MyServiceReceiver();
	    registerReceiver(mReceiver,filter);
	    super.onStart(intent, startId);
	    Log.i("MyService", "MyService Start!");
	  }
2.当需要在运行中通过按钮等事件触发传递命令,使Service执行某些动作(Action)时,可以自定义类;这里首先是有个AbstractServiceCommand,实现了Serializable接口,各种具体命令继承即可,那么发送广播如下即可:其中的SERVICE_COMMAND是自定义的字符串,用于区分广播的或者传递的数据等;

SetRunFlagServiceCommand setRunFlagCmd= new SetRunFlagServiceCommand();
setRunFlagCmd.setRunFlag(mbRunFlag);
sendServiceCmd(setRunFlagCmd);
Log.i(CLASS_TAG,setRunFlagCmd.printContent());
protected void sendServiceCmd(AbstractServiceCommand cmd) {
    // TODO Auto-generated method stub
    Bundle bundle = new Bundle();
    bundle.putSerializable(SERVICE_COMMAND, cmd);
    Intent i = new Intent(SERVICE_COMMAND);
    i.putExtras(bundle);
    sendBroadcast(i);
}
3.实现接收

public class MyServiceReceiver extends BroadcastReceiver {

		public boolean mbRunFlagReceiver = false;
		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
			Bundle bundle = intent.getExtras();
			AbstractServiceCommand serviceCmd = (AbstractServiceCommand) bundle.getSerializable(SERVICE_COMMAND);
			serviceCmd.executeCommand();
			Log.i(SERVICE_COMMAND,serviceCmd.printContent());
			
		}

	}
最后是记得因为在Onstart()中注册了接收广播,用SERVICE_COMMAND作为过滤符;那在Service销毁时,要unregisterReceiver(mReceiver);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值