案例:通过service向远程服务器发送请求,根据服务器返回的结果动态更新主程序UI界面,主程序可实时关闭或重启服务。
方案一:使用广播+Service
注册BroadcastReceiver
1、在主程序activity中注册一个BroadcastReceiver,用于接收Service发布的广播。
@Override protected void onStart() {//重写onStart方法 dataReceiver = new DataReceiver(); IntentFilter filter = new IntentFilter();//创建IntentFilter对象 filter.addAction("com.xiaoshan.app"); registerReceiver(dataReceiver, filter);//注册Broadcast Receiver super.onStart(); }
2、在Service中注册一个BroadcastReceiver,用于接收主程序发布的广播。
@Override public int onStartCommand(Intent intent, int flags, int startId) {//重写onStartCommand方法
cmdReceiver = new CmdReceiver(); IntentFilter filter = new IntentFilter();//创建IntentFilter对象 filter.addAction("com.xiaoshan.service"); registerReceiver(cmdReceiver, filter);//注册Broadcast Receiver return super.onStartCommand(intent, flags, startId); }
发送广播
1、主程序发布广播,Service接收读取数据。
如:主程序activity可发布广播,用于向后台service传递数据或控制信息,如停止service命令。
btnStop.setOnClickListener(new OnClickListener() {//为按钮添加点击事件监听 @Override public void onClick(View v) {//重写onClick方法 Intent myIntent = new Intent();//创建Intent对象 myIntent.setAction("com.xiaoshan.service"); myIntent.putExtra("cmd", CMD_STOP_SERVICE); sendBroadcast(myIntent);//发送广播 } });
2、Service发布广播,主程序Activity接收更新UI。
如:Service后台读取网络数据,用于向Activity传递数据或控制界面信息,更新UI。
//连接服务器读取数据(略) Object data;//服务器返回的数据data Intent intent = new Intent();//创建Intent对象 intent.setAction("com.xiaoshan.app"); intent.putExtra("data", data); sendBroadcast(intent);//发送广播
如上实现双向广播注册和接收来实现Service和主程序Activity之间的数据交互或控制。
方案二:使用Handler
1、在主程序的Activity中声明一个static变量handler,里面写好回调函数
TextView tv = ……;//这里省略 public static Handler handler = new Handler(new Callback() { @Override public boolean handleMessage(Message msg) { tv.setText(msg.getData().getString("content")); return false; } });2、在Service里面,调用这个handler,传输数据。
Message msg = MyActivity.handler.obtainMessage(); Bundle data = new Bundle(); data.putString("content",content); msg.setData(data); msg.sendToTarget();