之前曾介紹過Android的UI設計與后台線程交互,據Android API的介紹,service一般是在后台運行的,沒有界面的。那么如何實現service動態更新UI界面呢?
案例:通過service向遠程服務器發送請求,根據服務器返回的結果動態更新主程序UI界面,主程序可實時關閉或重啟服務。
注冊BroadcastReceiver
在主程序activity中注冊一個BroadcastReceiver,用於接收Service發布的廣播。
1 @Override 2 protected void onStart() 3 {// 重寫onStart方法 4 dataReceiver = new DataReceiver(); 5 IntentFilter filter = new IntentFilter();// 創建IntentFilter對象 6 filter.addAction("com.szy.ui.service"); 7 registerReceiver(dataReceiver, filter);// 注冊Broadcast Receiver 8 super.onStart(); 9 }
停止service命令
主程序activity可發布廣播,用於向后台service傳遞數據或控制信息,如停止service命令。
1 btnStop.setOnClickListener(new OnClickListener() 2 { 3 //為按鈕添加點擊事件監聽 4 @Override 5 public void onClick(View v) 6 {//重寫onClick方法 7 Intent myIntent = new Intent();//創建Intent對象 8 myIntent.setAction("com.szy.ui.service"); 9 myIntent.putExtra("cmd", CMD_STOP_SERVICE); 10 sendBroadcast(myIntent);//發送廣播 11 } 12 });
接收廣播
后台service注冊BroadCastReceiver用於接受主程序發送的廣播
1 @Override 2 public int onStartCommand(Intent intent, int flags, int startId) 3 {// 重寫onStartCommand方法 4 IntentFilter filter = new IntentFilter();// 創建IntentFilter對象 5 filter.addAction("com.szy.ui.service"); 6 registerReceiver(cmdReceiver, filter);// 注冊Broadcast Receiver 7 doJob();// 調用方法啟動線程,自己來完成 8 return super.onStartCommand(intent, flags, startId); 9 }
實時發送
后台service在doJob()方法中連接服務器並向主程序實時發送廣播。
1 /** 2 * 啟動一個子純種並連接服務器,接收服務器返回數據data。代碼略。。。 3 */ 4 Object data;//服務器返回的數據data 5 Intent intent = new Intent();//創建Intent對象 6 intent.setAction("com.szy.ui.service"); 7 intent.putExtra("data", data); 8 sendBroadcast(intent);//發送廣播
至此,我們實現了主程序通過接收廣播實時更新應用的UI界面。