閱讀308 返回首頁    go 微軟 go windows


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

  上一篇:go 政府數十萬設備為何擋不住小黑客
  下一篇:go 文件句柄備忘