service內操作UI

開發過程中需要在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();

 } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章