在Android中實現Service動態更新UI界麵(Service與主程序Activity之間的數據交互或控製)
案例:通過service向遠程服務器發送請求,根據服務器返回的結果動態更新主程序UI界麵,主程序可實時關閉或重啟服務。
方案一:使用廣播+Service
注冊BroadcastReceiver
1、在主程序activity中注冊一個BroadcastReceiver,用於接收Service發布的廣播。
@Override
protected void onStart() {//重寫onStart方法
dataReceiver = new DataReceiver();
IntentFilter filter = new IntentFilter();//創建IntentFilter對象
filter.addAction("com.xiaoshan.app");
registerReceiver(dataReceiver, filter);//注冊Broadcast Receiver
super.onStart();
}
2、在Service中注冊一個BroadcastReceiver,用於接收主程序發布的廣播。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {//重寫onStartCommand方法
cmdReceiver = new CmdReceiver();
IntentFilter filter = new IntentFilter();//創建IntentFilter對象
filter.addAction("com.xiaoshan.service");
registerReceiver(cmdReceiver, filter);//注冊Broadcast Receiver
return super.onStartCommand(intent, flags, startId);
}
發送廣播
1、主程序發布廣播,Service接收讀取數據。
如:主程序activity可發布廣播,用於向後台service傳遞數據或控製信息,如停止service命令。
btnStop.setOnClickListener(new OnClickListener() {//為按鈕添加點擊事件監聽
@Override
public void onClick(View v) {//重寫onClick方法
Intent myIntent = new Intent();//創建Intent對象
myIntent.setAction("com.xiaoshan.service");
myIntent.putExtra("cmd", CMD_STOP_SERVICE);
sendBroadcast(myIntent);//發送廣播
}
});
2、Service發布廣播,主程序Activity接收更新UI。
如:Service後台讀取網絡數據,用於向Activity傳遞數據或控製界麵信息,更新UI。
//連接服務器讀取數據(略)
Object data;//服務器返回的數據data
Intent intent = new Intent();//創建Intent對象
intent.setAction("com.xiaoshan.app");
intent.putExtra("data", data);
sendBroadcast(intent);//發送廣播
如上實現雙向廣播注冊和接收來實現Service和主程序Activity之間的數據交互或控製。
方案二:使用Handler
1、在主程序的Activity中聲明一個static變量handler,裏麵寫好回調函數
TextView tv = ……;//這裏省略
public static Handler handler = new Handler(new Callback() {
@Override
public boolean handleMessage(Message msg) {
tv.setText(msg.getData().getString("content"));
return false;
}
});2、在Service裏麵,調用這個handler,傳輸數據。
Message msg = MyActivity.handler.obtainMessage();
Bundle data = new Bundle();
data.putString("content",content);
msg.setData(data);
msg.sendToTarget();
最後更新:2017-04-02 17:28:36