簡體   English   中英

Android ::綁定所有活動的服務

[英]Android :: Bind Service for all activity

我想做類似主題所說的事情,但我不知道應該采取什么步驟。

我可以為每個活動綁定服務,並調用服務方法或服務調用活動方法。

這是一些解決方法。 我使用IBinder方法在服務和活動之間進行通信。

@Override
protected void onStart() {
    super.onStart();

    mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Toast.makeText(Screen1.this, "Service is connected", 1000).show();
            mBounded = true;
            MqttPushService.LocalBinder mLocalBinder = (MqttPushService.LocalBinder)service;
            mService = mLocalBinder.getServerInstance();
            mService.setServiceCallbacks(Screen1.this);
            //get temp info
            try {
                mService.send("info","topic1/sensor1");
            } catch (MqttException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Toast.makeText(Screen1.this, "Service is disconnected", 1000).show();
            mBounded = false;
            mService = null;
        }
    };


    //Bind Service and Activity
    Intent mIntent = new Intent(this,MqttPushService.class);
    bindService(mIntent, mConnection, BIND_AUTO_CREATE);

}//END of onStart()

@Override
protected void onStop() {
    super.onStop();
    if(mBounded) {
        mService.setServiceCallbacks(null); // unregister
        unbindService(mConnection);
        mBounded = false;
    }
}//END of onStop()

但是,我不能一次將服務綁定到所有活動。

我想使用基本活動類,但沒有希望。

我嘗試在基類中實現綁定服務,然后讓其他人擴展此基服務

基礎類

@Override
protected void onStart() {
    super.onStart();

    mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mBounded = true;
            MqttPushService.LocalBinder mLocalBinder = (MqttPushService.LocalBinder)service;
            mService = mLocalBinder.getServerInstance();
            mService.setServiceCallbacks(BaseActivity.this);

            mListener.doServiceConnected();

            Toast.makeText(getBaseContext(), "Service is connected", 0).show();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mBounded = false;
            mService = null;
            Toast.makeText(getBaseContext(), "Service is disconnected", 0).show();
        }
    };

    //Bind MQTT Service and Activity
    Intent mIntent = new Intent(this,MqttPushService.class);
    bindService(mIntent, mConnection, BIND_AUTO_CREATE);
}

@Override
protected void onStop() {
    super.onStop();

    if(mBounded) {
        mService.setServiceCallbacks(null); // unregister
        unbindService(mConnection);
        mBounded = false;
    }
}

@Override
public void doSomething(String act) {
    mListener.doServiceReturn(act);
}

protected void setServiceAttachedListener(onServiceAttached listener) {
    mListener = listener;
}

public interface onServiceAttached{
    void doServiceConnected();
    void doServiceReturn(String act);
}

當Screen1.class(第一個活動)設置回調方法時

  1. 呼叫服務方法並執行一些任務
  2. 聆聽返回的resul並執行一些任務

在這個類中沒有問題,但是當我打算創建一個新的screen(SleepMode.class)時,它是類似於該類的實現,但是服務Log.d我是serviceCallBacks的null。 服務何時要調用活動方法。

public class Screen1 extends BaseActivity implements BaseActivity.onServiceAttached  {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View contentView = inflater.inflate(R.layout.main, null, false);
    mDrawer.addView(contentView, 0);

    setServiceAttachedListener(Screen1.this);
}

@Override
public void doServiceConnected() {

    try {
        mService.send("info","topic1/sensor1");
    } catch (MqttException e) {
        e.printStackTrace();
    }
}

@Override
public void doServiceReturn(String act) {
    if (act.equals("SCREEN1")) {
        this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                updateCurrentFragment();
            }
        });
    }
}

}

最后

我的目標是我想將服務與所有活動綁定在一起。 此外,服務和活動應該能夠互相交談。是否可能? 請告訴我一些方法。

注意

我嘗試總結我的問題,但我不知道從哪里開始。

我嘗試展示一些解決方法,並想告訴您發生了什么。

很抱歉讓這個問題有點漫長。

首先,您的Service不是綁定到活動的Service ,您的Service是進行某些操作的組件,您的活動是綁定到服務以從中獲取數據或某些東西的活動。

因此,每次打開新活動時,您都需要綁定到服務,因此在onCreate中具有將基本活動綁定到服務的方法非常好。

然后您可以擁有服務實現的接口,以便可以與服務進行通信,並具有一些回調,以便在服務需要與活動進行通信時通知您的活動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM