【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 1532|回复: 0

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

[复制链接]
发表于 2013-1-16 16:53:58 | 显示全部楼层 |阅读模式
今天主要说明的是Activity(或者其中的View,通过传递Context即可)怎么与Service不断地交互信息;如果只是一开始的传递数据,完全可以通过在创建Service前通过Intent配合Bundle传递;如果需要来回交换一些状态信息或者动作命令(Action),则可以利用Broadcast和Receiver来实现。

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

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


1.首先是创建Service
  1. Intent i = new Intent(this, MyService.class);
  2. i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  3. i.putExtra("RunFlag", mbRunFlag);
  4. startService(i);
复制代码
如果从Activity传递的是简单数据类型,Intent中提供的非常全,如果是自定义类,可以通过Bundle来实现,下面有用到。其中,MyService继承自Service,里面实现了onStart()时所做的接收工作如下:
  1. <span style="white-space:pre">        </span>  @Override
  2.           public void onStart(Intent intent, int startId)
  3.           {
  4.             // TODO Auto-generated method stub            
  5.             mbRunFlag = intent.getLongExtra("RunFlag", mbRunFlag);
  6.             IntentFilter filter = new IntentFilter(SERVICE_COMMAND);
  7.             //下面是开启的对广播的接收处理工作
  8.             mReceiver = new MyServiceReceiver();
  9.             registerReceiver(mReceiver,filter);
  10.             super.onStart(intent, startId);
  11.             Log.i("MyService", "MyService Start!");
  12.           }
复制代码
2.当需要在运行中通过按钮等事件触发传递命令,使Service执行某些动作(Action)时,可以自定义类;这里首先是有个AbstractServiceCommand,实现了Serializable接口,各种具体命令继承即可,那么发送广播如下即可:其中的SERVICE_COMMAND是自定义的字符串,用于区分广播的或者传递的数据等;
  1. SetRunFlagServiceCommand setRunFlagCmd= new SetRunFlagServiceCommand();
  2. setRunFlagCmd.setRunFlag(mbRunFlag);
  3. sendServiceCmd(setRunFlagCmd);
  4. Log.i(CLASS_TAG,setRunFlagCmd.printContent());
复制代码
  1. protected void sendServiceCmd(AbstractServiceCommand cmd) {
  2.     // TODO Auto-generated method stub
  3.     Bundle bundle = new Bundle();
  4.     bundle.putSerializable(SERVICE_COMMAND, cmd);
  5.     Intent i = new Intent(SERVICE_COMMAND);
  6.     i.putExtras(bundle);
  7.     sendBroadcast(i);
  8. }
复制代码
3.实现接收
  1. public class MyServiceReceiver extends BroadcastReceiver {

  2.                 public boolean mbRunFlagReceiver = false;
  3.                 @Override
  4.                 public void onReceive(Context context, Intent intent) {
  5.                         // TODO Auto-generated method stub
  6.                         Bundle bundle = intent.getExtras();
  7.                         AbstractServiceCommand serviceCmd = (AbstractServiceCommand) bundle.getSerializable(SERVICE_COMMAND);
  8.                         serviceCmd.executeCommand();
  9.                         Log.i(SERVICE_COMMAND,serviceCmd.printContent());
  10.                        
  11.                 }

  12.         }
复制代码
最后是记得因为在Onstart()中注册了接收广播,用SERVICE_COMMAND作为过滤符;那在Service销毁时,要unregisterReceiver(mReceiver);
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-6-29 06:13

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表