[英]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(第一個活動)設置回調方法時
在這個類中沒有問題,但是當我打算創建一個新的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.