gpt4 book ai didi

android - 干净地绑定(bind)/取消绑定(bind)到应用程序中的服务

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:22:26 25 4
gpt4 key购买 nike

我有一个绑定(bind)到持久服务的 Android 应用程序(一旦使用 startService() 启动)。

服务是应用程序不可或缺的一部分,因此几乎在每个 Activity 中都会用到。因此,我只想绑定(bind)到服务一次(而不是在每个 Activity 中绑定(bind)/解除绑定(bind))并在我的应用程序的生命周期内保持绑定(bind)。

我已经从 Application 扩展了并绑定(bind)到 Application#onCreate() 中的服务.但是我现在有一个问题,我不知道自 Application#onTerminate() 以来我的应用程序何时存在。从未被调用,请参阅 JavaDoc:

This method is for use in emulated process environments. It will never be called on a production Android device, where processes are removed by simply killing them; no user code (including this callback) is executed when doing so.

那么我该如何彻底解除绑定(bind)在应用程序中的服务呢?

最佳答案

我通过计算 Application 中对服务绑定(bind)的引用来解决这个问题。每个 Activity 都必须在它们的 onCreate() 方法中调用 acquireBinding() 并在 中调用 releaseBinding() >onDestroy()。如果引用计数器达到零,则释放绑定(bind)。

这是一个例子:

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();
}
}

关于android - 干净地绑定(bind)/取消绑定(bind)到应用程序中的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9364230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com