在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