Java Android:在多活动应用程序中使用服务的正确方式
我知道,关于泄露Android服务以及如何在应用程序中维护服务,有很多问题,但这有点像是看到两个医生有一个问题:你会得到三种不同的意见 换句话说:我完全不确定如何以正确的方式处理我的服务。所以这个问题 我有以下内容:几个活动和一个BoundService,它在应用程序启动时启动,应该一直保持活动状态,直到应用程序关闭 delevoper建议使用绑定服务来简化服务和活动之间的通信。因此,我在每个activitie的onStart中绑定我的服务,并在每个onStop中解除绑定以防止泄漏 此外,我在几个线程中读到,当没有活动绑定到服务时,应该使用startService来防止服务被破坏。因此,我在我的第一个活动中使用了一个明确的startService,在我的应用程序的每个出口点上使用了一个stopService 所以基本上我有这个作为我的服务: 然后开始这样的活动:Java Android:在多活动应用程序中使用服务的正确方式,java,android,service,Java,Android,Service,我知道,关于泄露Android服务以及如何在应用程序中维护服务,有很多问题,但这有点像是看到两个医生有一个问题:你会得到三种不同的意见 换句话说:我完全不确定如何以正确的方式处理我的服务。所以这个问题 我有以下内容:几个活动和一个BoundService,它在应用程序启动时启动,应该一直保持活动状态,直到应用程序关闭 delevoper建议使用绑定服务来简化服务和活动之间的通信。因此,我在每个activitie的onStart中绑定我的服务,并在每个onStop中解除绑定以防止泄漏 此外,我在几
public class ActFirstActivity extends Activity {
private NetworkService networkService;
private boolean networkServiceIsBound = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_1);
}
@Override
protected void onStart() {
super.onStart();
Intent serviceIntent = new Intent(this, NetworkService.class);
startService(serviceIntent);
bindService(serviceIntent, networkServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
unbindService(networkServiceConnection);
}
private ServiceConnection networkServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
ServiceBinder binder = (ServiceBinder) service;
networkService = binder.getService();
networkServiceIsBound = true;
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
networkServiceIsBound = false;
}
};
}
其他每个活动都将具有相同的绑定/取消绑定功能和相同的ServiceConnection。据我所知,这可以防止我的应用程序泄漏服务连接。但我的印象是,我在这里引入了很多开销。如何做到这一点
安全无泄漏,
b有效的最小开销,以及
c易于维护代码?
感谢所有花时间回答问题的人:ad b而不是结对恢复/暂停使用活动的开始/停止事件如果onPause被调用,并且活动被暂停然后被销毁(例如,由于资源短缺),这不会导致服务泄漏吗?如果它被销毁,那么谁在乎呢?请参阅:部分附加注释感谢-相应编辑的线程中的代码
public class ActFirstActivity extends Activity {
private NetworkService networkService;
private boolean networkServiceIsBound = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_1);
}
@Override
protected void onStart() {
super.onStart();
Intent serviceIntent = new Intent(this, NetworkService.class);
startService(serviceIntent);
bindService(serviceIntent, networkServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
unbindService(networkServiceConnection);
}
private ServiceConnection networkServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
ServiceBinder binder = (ServiceBinder) service;
networkService = binder.getService();
networkServiceIsBound = true;
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
networkServiceIsBound = false;
}
};
}