android – 清理绑定/解除绑定到应用程序中的服务

前端之家收集整理的这篇文章主要介绍了android – 清理绑定/解除绑定到应用程序中的服务前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个绑定到持久服务的 Android应用程序(一旦从startService()开始).

该服务是应用程序的组成部分,因此几乎在每个Activity中都使用.因此,我想要绑定到服务一次(而不是绑定/解除绑定在每个活动),并保持绑定在我的应用程序的生命周期.

我已经从Application扩展,并在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.

那么如何从应用程序中绑定的服务彻底解除绑定?

解决方法

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

以下是一个例子:

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相关文章