閱讀931 返回首頁    go 阿裏雲 go 技術社區[雲棲]


在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

  上一篇:go JSON-lib框架,轉換JSON、XML不再困難
  下一篇:go 兼容IE、FireFox等跨瀏覽器播放背景音樂 html