在Android中實現(xiàn)service動態(tài)更新UI界面
之前我們曾向您介紹過Android的UI設(shè)計與后臺線程交互,據(jù)Android API的介紹,service一般是在后臺運行的,沒有界面的。那么如何實現(xiàn)service動態(tài)更新UI界面呢?
案例:通過service向遠程服務(wù)器發(fā)送請求,根據(jù)服務(wù)器返回的結(jié)果動態(tài)更新主程序UI界面,主程序可實時關(guān)閉或重啟服務(wù)。
注冊BroadcastReceiver
在主程序activity中注冊一個BroadcastReceiver,用于接收Service發(fā)布的廣播。
- @Override
- protected void onStart() {//重寫onStart方法
- dataReceiver = new DataReceiver();
- IntentFilter filter = new IntentFilter();//創(chuàng)建IntentFilter對象
- filter.addAction("com.justel.serviceBC");
- registerReceiver(dataReceiver, filter);//注冊Broadcast Receiver
- super.onStart();
- }
停止service命令
主程序activity可發(fā)布廣播,用于向后臺service傳遞數(shù)據(jù)或控制信息,如停止service命令。
- btnStop.setOnClickListener(new OnClickListener() {//為按鈕添加點擊事件監(jiān)聽
- @Override
- public void onClick(View v) {//重寫onClick方法
- Intent myIntent = new Intent();//創(chuàng)建Intent對象
- myIntent.setAction("com.justel.service");
- myIntent.putExtra("cmd", CMD_STOP_SERVICE);
- sendBroadcast(myIntent);//發(fā)送廣播
- }
- });
接收廣播
后臺service注冊BroadCastReceiver用于接受主程序發(fā)送的廣播
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {//重寫onStartCommand方法
- IntentFilter filter = new IntentFilter();//創(chuàng)建IntentFilter對象
- filter.addAction("com.justel.service");
- registerReceiver(cmdReceiver, filter);//注冊Broadcast Receiver
- doJob();//調(diào)用方法啟動線程,自己來完成
- return super.onStartCommand(intent, flags, startId);
- }
實時發(fā)送
后臺service在doJob()方法中連接服務(wù)器并向主程序?qū)崟r發(fā)送廣播。
- /**
- * 啟動一個子純種并連接服務(wù)器,接收服務(wù)器返回數(shù)據(jù)data。代碼略。。。
- */
- Object data;//服務(wù)器返回的數(shù)據(jù)data
- Intent intent = new Intent();//創(chuàng)建Intent對象
- intent.setAction("com.justel.service");
- intent.putExtra("data", data);
- sendBroadcast(intent);//發(fā)送廣播
至此,我們實現(xiàn)了主程序通過接收廣播實時更新應(yīng)用的UI界面。
【編輯推薦】