在Android中,异步更新UI,通常我们会选用Handler启动线程,或者sendMessage的方式,那么利用Service和广播也可以更新UI的,例子如下:我们建立一个Service:
package com.andy import android.app.Service;//引入相关包 import android.content.BroadcastReceiver;//引入相关包 import android.content.Context;//引入相关包 import android.content.Intent;//引入相关包 import android.content.IntentFilter;//引入相关包 import android.os.IBinder;//引入相关包 //继承自Service的子类 public class MyService extends Service{ CommandReceiver cmdReceiver; boolean flag; @Override public void onCreate(){//重写onCreate方法 flag = true; cmdReceiver = newCommandReceiver(); super.onCreate(); } @Override public IBinder onBind(Intent intent){//重写onBind方法 // TODO Auto-generated methodstub return null; } @Override public int onStartCommand(Intent intent, intflags, int startId) {//重写onStartCommand方法 IntentFilter filter = newIntentFilter();//创建IntentFilter对象 filter.addAction("wyf.wpf.MyService"); registerReceiver(cmdReceiver,filter);//注册Broadcast Receiver doJob();//调用方法启动线程 returnsuper.onStartCommand(intent, flags, startId); } //方法: public void doJob(){ newThread(){ publicvoid run(){ while(flag){ try{//睡眠一段时间 Thread.sleep(1000); } catch(Exceptione){ e.printStackTrace(); } Intent intent = newIntent();//创建Intent对象 intent.setAction("wyf.wpf.Sample_3_6"); intent.putExtra("data",Math.random()); sendBroadcast(intent);//发送广播 } } }.start(); } private class CommandReceiver extendsBroadcastReceiver{//继承自BroadcastReceiver的子类 @Override public void onReceive(Contextcontext, Intent intent) {//重写onReceive方法 int cmd =intent.getIntExtra("cmd", -1);//获取Extra信息 if(cmd ==Sample_3_6.CMD_STOP_SERVICE){//如果发来的消息是停止服务 flag = false;//停止线程 stopSelf();//停止服务 } } } @Override public void onDestroy(){//重写onDestroy方法 this.unregisterReceiver(cmdReceiver);//取消注册的CommandReceiver super.onDestroy(); } }
建立一个activity
package com.andy;//声明包语句 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.TextView;//引入相关包 //继承自Activity的子类 public class Sample_3_6 extends Activity { public static final int CMD_STOP_SERVICE =0; ButtonbtnStart;//开始服务Button对象应用 Button btnStop;//停止服务Button对象应用 TextView tv;//TextView对象应用 DataReceiverdataReceiver;//BroadcastReceiver对象 @Override public void onCreate(BundlesavedInstanceState) {//重写onCreate方法 super.onCreate(savedInstanceState); setContentView(R.layout.main);//设置显示的屏幕 btnStart =(Button)findViewById(R.id.btnStart); btnStop =(Button)findViewById(R.id.btnStop); tv =(TextView)findViewById(R.id.tv); btnStart.setOnClickListener(newOnClickListener() {//为按钮添加点击事件监听 @Override publicvoid onClick(View v) {//重写onClick方法 Intent myIntent = new Intent(Sample_3_6.this,wyf.wpf.MyService.class); Sample_3_6.this.startService(myIntent);//发送Intent启动Service } }); btnStop.setOnClickListener(newOnClickListener() {//为按钮添加点击事件监听 @Override publicvoid onClick(View v) {//重写onClick方法 Intent myIntent = newIntent();//创建Intent对象 myIntent.setAction("wyf.wpf.MyService"); myIntent.putExtra("cmd",CMD_STOP_SERVICE); sendBroadcast(myIntent);//发送广播 } }); } private class DataReceiver extendsBroadcastReceiver{//继承自BroadcastReceiver的子类 @Override public void onReceive(Contextcontext, Intent intent) {//重写onReceive方法 doubledata = intent.getDoubleExtra("data", 0); tv.setText("Service的数据为:"+data); } } @Override protected void onStart(){//重写onStart方法 dataReceiver = newDataReceiver(); IntentFilter filter = newIntentFilter();//创建IntentFilter对象 filter.addAction("wyf.wpf.Sample_3_6"); registerReceiver(dataReceiver, filter);//注册BroadcastReceiver super.onStart(); } @Override protected void onStop(){//重写onStop方法 unregisterReceiver(dataReceiver);//取消注册BroadcastReceiver super.onStop(); } }
时间: 2024-10-30 15:50:27