【Android】Service通过广播更新UI

来源:互联网 发布:模仿电影片段软件 编辑:程序博客网 时间:2024/06/09 23:48
定义一个activity,在activity中定义一个内部广播接收器,并且动态注册该广播接收器:
[java] view plain copy print?
  1. package com.zzj.ui.serviceUpdateUIDemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.BroadcastReceiver;  
  5. import android.content.Context;  
  6. import android.content.Intent;  
  7. import android.content.IntentFilter;  
  8. import android.os.Bundle;  
  9. import android.widget.TextView;  
  10.   
  11. import com.zzj.ui.R;  
  12.   
  13. public class MainActivity extends Activity {  
  14.     private TextView textView;  
  15.     public static final String ACTION_UPDATEUI = "action.updateUI";  
  16.     UpdateUIBroadcastReceiver broadcastReceiver;  
  17.   
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.   
  22.         setContentView(R.layout.service_update_ui);  
  23.         textView = (TextView) findViewById(R.id.count_txt);  
  24.   
  25.         // 动态注册广播  
  26.         IntentFilter filter = new IntentFilter();  
  27.         filter.addAction(ACTION_UPDATEUI);  
  28.         broadcastReceiver = new UpdateUIBroadcastReceiver();  
  29.         registerReceiver(broadcastReceiver, filter);  
  30.   
  31.         // 启动服务  
  32.         Intent intent = new Intent(this, ServiceUpdateUI.class);  
  33.         startService(intent);  
  34.     }  
  35.   
  36.     /** 
  37.      * 定义广播接收器(内部类) 
  38.      *  
  39.      * @author lenovo 
  40.      *  
  41.      */  
  42.     private class UpdateUIBroadcastReceiver extends BroadcastReceiver {  
  43.   
  44.         @Override  
  45.         public void onReceive(Context context, Intent intent) {  
  46.             textView.setText(String.valueOf(intent.getExtras().getInt("count")));  
  47.         }  
  48.   
  49.     }  
  50.   
  51.     @Override  
  52.     protected void onDestroy() {  
  53.         System.out.println("onDestroy");  
  54.         super.onDestroy();  
  55.         // 注销广播  
  56.         unregisterReceiver(broadcastReceiver);  
  57.     }  
  58. }  

activity布局文件:

[html] view plain copy print?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <TextView  
  8.         android:id="@+id/textView1"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:text="当前人数:" />  
  12.   
  13.     <TextView  
  14.         android:id="@+id/count_txt"  
  15.         android:layout_width="wrap_content"  
  16.         android:layout_height="wrap_content" />  
  17.   
  18. </LinearLayout>  
定义一个后台service,该service定时发送广播:
[java] view plain copy print?
  1. package com.zzj.ui.serviceUpdateUIDemo;  
  2.   
  3. import java.util.Timer;  
  4. import java.util.TimerTask;  
  5.   
  6. import android.app.Service;  
  7. import android.content.Intent;  
  8. import android.os.IBinder;  
  9.   
  10. public class ServiceUpdateUI extends Service {  
  11.     private Timer timer;  
  12.     private TimerTask task;  
  13.     private int count;  
  14.   
  15.     @Override  
  16.     public IBinder onBind(Intent intent) {  
  17.         return null;  
  18.     }  
  19.   
  20.     @Override  
  21.     public void onCreate() {  
  22.         super.onCreate();  
  23.   
  24.         final Intent intent = new Intent();  
  25.         intent.setAction(MainActivity.ACTION_UPDATEUI);  
  26.   
  27.         timer = new Timer();  
  28.         task = new TimerTask() {  
  29.   
  30.             @Override  
  31.             public void run() {  
  32.                 intent.putExtra("count", ++count);  
  33.                 sendBroadcast(intent);  
  34.             }  
  35.         };  
  36.         timer.schedule(task, 10001000);  
  37.     }  
  38.   
  39.     @Override  
  40.     public void onDestroy() {  
  41.         super.onDestroy();  
  42.         timer.cancel();  
  43.     }  
  44.   
  45. }  

界面效果:



即使Activity退出再启动,仍然能通过广播接收器得到当前人数。


0 0
原创粉丝点击