Sve*_*obs 13 service android bind unbind
我有一个绑定到持久服务的Android应用程序(一旦启动startService()).
该服务是应用程序不可或缺的一部分,因此几乎在每个Activity中都使用.因此,我想只绑定一次服务(而不是在每个Activity中绑定/解除绑定)并在我的应用程序的生命周期内保持绑定.
我已经从Application扩展并绑定到Application#onCreate()中的服务.但是我现在遇到的问题是我不知道我的应用程序何时存在,因为从未调用Application#onTerminate(),请参阅JavaDoc:
此方法用于模拟过程环境.永远不会在生产Android设备上调用它,只需杀死它们即可删除进程; 这样做时不会执行任何用户代码(包括此回调).
那么如何从Application中绑定的服务中干净地取消绑定?
Sve*_*obs 13
我通过计算对服务绑定的引用来解决这个问题Application.每Activity有调用acquireBinding()他们的onCreate()方法和调用releaseBinding()的onDestroy().如果引用计数器达到零,则释放绑定.
这是一个例子:
class MyApp extends Application {
private final AtomicInteger refCount = new AtomicInteger();
private Binding binding;
@Override
public void onCreate() {
// create service binding here
}
public Binding acquireBinding() {
refCount.incrementAndGet();
return binding;
}
public void releaseBinding() {
if (refCount.get() == 0 || refCount.decrementAndGet() == 0) {
// release binding
}
}
}
// Base Activity for all other Activities
abstract class MyBaseActivity extend Activity {
protected MyApp app;
protected Binding binding;
@Override
public void onCreate(Bundle savedBundleState) {
super.onCreate(savedBundleState);
this.app = (MyApp) getApplication();
this.binding = this.app.acquireBinding();
}
@Override
public void onDestroy() {
super.onDestroy();
this.app.releaseBinding();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9440 次 |
| 最近记录: |