我想做像话题一样的事情,但我不知道应该采取什么措施。
我可以为每个活动绑定服务,并调用服务方法或服务调用活动方法。
这是一些解决方法。我使用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()
但是,我无法一次性将服务绑定到所有活动。
我想使用Base Activity Class但没有希望。
我尝试在基类中实现绑定服务,让其他人扩展这个基本服务
基类
@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(First Activity)设置回调方法
时这个类没有问题,但是我的意图和新屏幕(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();
}
});
}
}
}
最后
我的目标是想要将服务绑定到所有活动。此外,服务和活动应该能够相互交谈..有可能吗?请告诉我一些方法。
注意
我试着总结一下我的问题,但我不知道从哪里开始。
我尝试展示一些工作,并想知道发生了什么。
很抱歉让它成为一个长长的问题。
答案 0 :(得分:0)
首先,您的Service
不是绑定到活动的那个,Service
是正在执行某些操作的组件,您的活动是按顺序绑定到服务的活动从中获取数据或其他东西。
因此,每次打开新活动时都需要绑定到您的服务,您的onCreate中具有绑定到服务的基本活动的方法非常好。
然后您可以拥有服务实现的接口,以便您可以与您的服务进行通信,并进行一些回调,以便在您的服务需要与活动进行通信时通知您的活动。