開發過程中需要在service中載入一個view,並且在任何頁面內都可以向service發送請求去改變view的顯示,由於無法在非主線程中進行UI操作,並且view相關數據在service內,所以必須通過別的方法去操作UI。
廣播
service內部自定義一個廣播繼承BroadcastReceiver
class FloatWindowBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//IntentFilter標識
if (ACTION_FLOAT.equals(action)){
//傳遞數據
String command = intent.getStringExtra("command");
int position = intent.getIntExtra("position",0);
switch (command){
case test:
break;
default:
ToastUtil.showMessage("參數錯誤");
break;
}
}
}
}
初始化,添加標識,註冊廣播。
private FloatWindowBroadcastReceiver floatWindowBroadcastReceiver;
@Override
public void onCreate() {
super.onCreate();
//初始化
floatWindowBroadcastReceiver = new FloatWindowBroadcastReceiver();
//標識
IntentFilter filter = new IntentFilter(ACTION_FLOAT);
//註冊廣播
registerReceiver(floatWindowBroadcastReceiver,filter);
}
在service銷燬時取消註冊廣播
@Override
public void onDestroy() {
if (floatWindowBroadcastReceiver != null){
unregisterReceiver(floatWindowBroadcastReceiver);
floatWindowBroadcastReceiver = null;
}
super.onDestroy();
}
在其他頁面內調用該方法操作
Intent intent=new Intent(FloatWindowService.ACTION_FLOAT);
intent.putExtra("command","add");
sendBroadcast(intent);
Handler
service內創建一個Handler用於接收消息
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
}
}
};
發送消息,是否需要啓用線程根據需求進行操作.
public void send(){
new Thread(new Runnable() {
@Override
public void run() {
Message message=new Message();
Bundle bundle=new Bundle();
message.setData(bundle);
handler.sendMessageDelayed(message,2000);
}).start();
}