Service通过广播Broadcast更新Activity UI

来源:互联网 发布:mac系统剪切 编辑:程序博客网 时间:2024/05/18 22:09

原文地址::http://www.pocketdigi.com/20110303/197.html

 

 

 

今天学习到Service,在用Service下载文件时,一个问题就是Service没有界面,如何通知用户当前下载的进度,Service直接向Activity传数据有点麻烦,于是想到了用Broadcast,Service广播,Activity负责接收,再对接收到的数据进行处理,就达到了我们的目的。下面是今天这个程序的运行效果:

先注册Receiver,然后开始Service,上面的TextView和ProgressBar就会随着Service传过来的值变,解除注册Receiver或者结束Service后不会再变。
Service代码:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
package com.services; import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.util.Log; public class TestService extends Service {boolean isStop=false;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubLog.i("TAG","绑定");return null;}public void onCreate(){Log.i("TAG","Services onCreate");super.onCreate();}public void onStart(Intent intent,int startId){Log.i("TAG","Services onStart");super.onStart(intent, startId);new Thread(){//新建线程,每隔1秒发送一次广播,同时把i放进intent传出public void run(){int i=0;while(!isStop){Intent intent=new Intent();intent.putExtra("i", i);i++;intent.setAction("android.intent.action.test");//action与接收器相同sendBroadcast(intent);Log.i("TAG",String.valueOf(i));try {sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}.start(); }@Overridepublic void onDestroy() {Log.i("TAG","Services onDestory");isStop=true;//即使service销毁线程也不会停止,所以这里通过设置isStop来停止线程super.onDestroy();} }

Activity代码:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
package com.services;  import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ProgressBar;import android.widget.TextView; public class main extends Activity {/** Called when the activity is first created. */Button b1,b2,b3,b4;TestService mService;ProgressBar pb;MyReceiver receiver;TextView tv;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);b1=(Button)findViewById(R.id.b1);b2=(Button)findViewById(R.id.b2);b3=(Button)findViewById(R.id.b3);b4=(Button)findViewById(R.id.b4);b1.setOnClickListener(l1);b2.setOnClickListener(l2);b3.setOnClickListener(l3);b4.setOnClickListener(l4);pb=(ProgressBar)findViewById(R.id.pb);tv=(TextView)findViewById(R.id.tv);}   public class MyReceiver extends BroadcastReceiver {//自定义一个广播接收器@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubSystem.out.println("OnReceiver");Bundle bundle=intent.getExtras();int a=bundle.getInt("i");pb.setProgress(a);tv.setText(String.valueOf(a));//处理接收到的内容 }public MyReceiver(){System.out.println("MyReceiver");//构造函数,做一些初始化工作,本例中无任何作用} }  OnClickListener l1=new OnClickListener(){ @Overridepublic void onClick(View v) {// TODO Auto-generated method stubstartService(new Intent(main.this, TestService.class));//开始服务} };OnClickListener l2=new OnClickListener(){ @Overridepublic void onClick(View v) {// TODO Auto-generated method stubstopService(new Intent(main.this, TestService.class));//结束服务} };OnClickListener l3=new OnClickListener(){ @Overridepublic void onClick(View v) {// TODO Auto-generated method stub//注册接收器receiver=new MyReceiver();IntentFilter filter=new IntentFilter();filter.addAction("android.intent.action.test");main.this.registerReceiver(receiver,filter);} };OnClickListener l4=new OnClickListener(){ @Overridepublic void onClick(View v) {// TODO Auto-generated method stubmain.this.unregisterReceiver(receiver);//解除注册接收器} };}

 

 

原创粉丝点击