Android Service和廣播聯合更新UI的例子
在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(); } }
最後更新:2017-04-03 21:30:11