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().如果引用计数器达到零,则释放绑定.

以下是一个例子:

  1. class MyApp extends Application {
  2. private final AtomicInteger refCount = new AtomicInteger();
  3. private Binding binding;
  4.  
  5. @Override
  6. public void onCreate() {
  7. // create service binding here
  8. }
  9.  
  10. public Binding acquireBinding() {
  11. refCount.incrementAndGet();
  12. return binding;
  13. }
  14.  
  15. public void releaseBinding() {
  16. if (refCount.get() == 0 || refCount.decrementAndGet() == 0) {
  17. // release binding
  18. }
  19. }
  20. }
  21.  
  22. // Base Activity for all other Activities
  23. abstract class MyBaseActivity extend Activity {
  24. protected MyApp app;
  25. protected Binding binding;
  26.  
  27. @Override
  28. public void onCreate(Bundle savedBundleState) {
  29. super.onCreate(savedBundleState);
  30. this.app = (MyApp) getApplication();
  31. this.binding = this.app.acquireBinding();
  32. }
  33.  
  34. @Override
  35. public void onDestroy() {
  36. super.onDestroy();
  37. this.app.releaseBinding();
  38. }
  39. }

猜你在找的Android相关文章