【问题标题】:Android Service: should it be declared as a process or not?Android Service:是否应该将其声明为进程?
【发布时间】:2015-07-07 17:45:14
【问题描述】:

我已经实现了一个简单的 Android Service,默认情况下,它部署在与我的应用程序/apk 相同的进程中。我希望服务与每个Activity 同时运行。为了实现这一点,在每个Activity.onStart()Activity.onStop() 实现中,我都有分别调用Activity.bindService()Activity.unbindService() 的逻辑。

嗯,这一切都很好,但感觉很尴尬。有没有其他方法可以确保Service 持续运行并绑定到所有活动,而不必为每个活动重新调用Activity.bindService()Activity.unbindService()?在这种情况下,Service 是否应该声明为独立进程?

另外,我的服务启动了一个单独的线程,但从不停止它。我的代码应该停止线程吗?线程有可能被孤立吗?使用OnUnbind / OnRebind 启动/停止线程似乎有点矫枉过正。

【问题讨论】:

  • 创建一个绑定/取消绑定服务的基础 Activity 并让你的所有活动扩展这个基础 Activity
  • 这是关于 Stackoverflow 的讨论,建议使用 pskink 提到的方法:stackoverflow.com/questions/2621395/…
  • 如果你的服务只是偶尔做任务,考虑使用 IntentService

标签: android multithreading


【解决方案1】:

创建一个基础Activity 并在onStart 中调用bindService,在onStop 中调用unbindService

public class BaseActivity extends Activity {

    @Override  
    public void onStart() {
        // ...
        bindService(intent, serviceConnection, flags);
    }

    @Override
    public void onStop() {
        // ....
        unbindService(serviceConnection);    
    }
}

这将确保扩展 base 的每个活动都绑定到服务。

当最后一个活动与服务解除绑定时,它将被停止。如果你想避免这种情况,请先调用startService,然后绑定它。即使您没有正在运行的活动,这也会阻止服务停止。

这种情况下的Service是否应该声明为独立进程?

在您的情况下,您的服务不需要单独的流程。

另外,我的服务启动了一个单独的线程,但从不停止它。我的代码应该停止线程吗?

如果你想停止你的服务,你应该停止你的线程,因为线程是一个 GC 根,从它访问的所有对象都将保留在内存中。所以,未使用的无限线程就是内存泄漏。

您可以根据自己的要求以不同的方式实现线程化。您可以在ServiceThreadPoolExecutorHandler 中实现常规线程。选择适合您需求的解决方案。

【讨论】:

    【解决方案2】:

    您可以在自定义应用程序类中启动您的服务。这样服务将仅在您的应用程序启动时启动。

    例如:

    public class MainApplication extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            starService();
        }
    
        public void starService() {
            Intent i = new Intent(this, YourService.class);
            this.startService(i);
        }
    }
    

    【讨论】:

      【解决方案3】:

      虽然其他答案很好,但您可能想问这个: “此服务是否需要在应用程序不运行且不会运行时继续运行?”

      • 如果是这样:创建为独立服务
      • 如果不是:扩展实现绑定/取消绑定的辅助类并让活动扩展它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-09
        • 1970-01-01
        • 2019-08-07
        • 1970-01-01
        • 2017-03-06
        • 1970-01-01
        • 2015-07-27
        相关资源
        最近更新 更多