在Android中实现Service动态更新UI界面(Service与主程序Activity之间的数据交互或控制)

来源:互联网 发布:淘宝女装店店铺简介 编辑:程序博客网 时间:2024/05/16 08:03

转载自:http://blog.csdn.net/catoop/article/details/7566845

案例:通过service向远程服务器发送请求,根据服务器返回的结果动态更新主程序UI界面,主程序可实时关闭或重启服务。

方案一:使用广播+Service注册BroadcastReceiver

1、在主程序activity中注册一个BroadcastReceiver,用于接收Service发布的广播。

[java] view plaincopy
  1. @Override   
  2. protected void onStart() {//重写onStart方法    
  3.     dataReceiver = new DataReceiver();    
  4.     IntentFilter filter = new IntentFilter();//创建IntentFilter对象    
  5.     filter.addAction("com.xiaoshan.app");    
  6.     registerReceiver(dataReceiver, filter);//注册Broadcast Receiver    
  7.     super.onStart();    
  8. }   


2、在Service中注册一个BroadcastReceiver,用于接收主程序发布的广播。

[java] view plaincopy
  1.     @Override   
  2.     public int onStartCommand(Intent intent, int flags, int startId) {//重写onStartCommand方法          <pre name="code" class="java">        cmdReceiver = new CmdReceiver();  
  3.         IntentFilter filter = new IntentFilter();//创建IntentFilter对象    
  4.         filter.addAction("com.xiaoshan.service");  
  5.         registerReceiver(cmdReceiver, filter);//注册Broadcast Receiver    
  6.         return super.onStartCommand(intent, flags, startId);    
  7.     } </pre>  
  8. <pre></pre>  
  9. <p></p>  
  10. <pre></pre>  
  11. <p></p>  
  12. <h2><a name="t2"></a>发送广播</h2>  
  13. <p>1、主程序发布广播,Service接收读取数据。</p>  
  14. <p>如:主程序activity可发布广播,用于向后台service传递数据或控制信息,如停止service命令。</p>  
  15. <p></p>  
  16. <pre name="code" class="java">    btnStop.setOnClickListener(new OnClickListener() {//为按钮添加点击事件监听       
  17.         @Override   
  18.         public void onClick(View v) {//重写onClick方法    
  19.             Intent myIntent = new Intent();//创建Intent对象    
  20.             myIntent.setAction("com.xiaoshan.service");    
  21.             myIntent.putExtra("cmd", CMD_STOP_SERVICE);    
  22.             sendBroadcast(myIntent);//发送广播    
  23.         }    
  24.     }); </pre><br>  
  25. 2、Service发布广播,主程序Activity接收更新UI。  
  26. <p></p>  
  27. <p>如:Service后台读取网络数据,用于向Activity传递数据或控制界面信息,更新UI。</p>  
  28. <p></p>  
  29. <pre name="code" class="java">//连接服务器读取数据(略)  
  30. Object data;//服务器返回的数据data  
  31. Intent intent = new Intent();//创建Intent对象    
  32. intent.setAction("com.xiaoshan.app");    
  33. intent.putExtra("data", data);    
  34. sendBroadcast(intent);//发送广播 </pre>  
  35. <p></p>  
  36. <p><br>  
  37. </p>  
  38. <p>如上实现双向广播注册和接收来实现Service和主程序Activity之间的数据交互或控制。<br>  
  39. <br>  
  40. </p>  
  41. <p></p>  
  42. <h2><a name="t3"></a><span style="font-size:32px">

  1. 方案二:使用Handler</span><br>  
  2. </h2>  
  3. 1、在主程序的Activity中声明一个static变量handler,里面写好回调函数  
  4. <p></p>  
  5. <p></p><pre name="code" class="java">   TextView tv = ……;//这里省略  
  6.   
  7.         public static Handler handler = new Handler(new Callback() {  
  8.   
  9.         @Override  
  10.         public boolean handleMessage(Message msg) {  
  11.             tv.setText(msg.getData().getString("content"));  
  12.             return false;  
  13.         }  
  14.     });</pre>2、在Service里面,调用这个handler,传输数据。<p></p>  
  15. <p></p><pre name="code" class="java">       Message msg = MyActivity.handler.obtainMessage();  
  16.         Bundle data = new Bundle();  
  17.         data.putString("content",content);  
  18.         msg.setData(data);  
  19.         msg.sendToTarget();</pre><br>  
  20. <br>  
  21. <p></p>  
  22. <p><br>  
  23. </p>  
  24. <p><br>  
  25. </p>  
  26. <br>  
  27. <br>  
  28. <pre></pre>  
原创粉丝点击