干净地绑定/解除绑定到应用程序中的服务

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)