Android服务:它应该被声明为进程吗?

时间:2015-07-07 17:45:15

标签: android multithreading

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

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

此外,我的服务启动一个单独的线程,但永远不会停止它。我的代码应该停止线程吗?线程有可能成为孤儿吗?使用OnUnbind / OnRebind开始/停止主题似乎有点矫枉过正。

3 个答案:

答案 0 :(得分:0)

您可以在自定义应用程序类中启动服务。这样,只有在启动应用程序时才会启动服务。

例如:

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

答案 1 :(得分:0)

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

  • 如果是这样的话:创建一个独立的服务
  • 如果不是:扩展一个实现bind / unbind的helper类,并让Activities扩展它。

答案 2 :(得分:0)

创建一个基础Activity并在bindService onStart unbindService onStop中呼叫public class BaseActivity extends Activity { @Override public void onStart() { // ... bindService(intent, serviceConnection, flags); } @Override public void onStop() { // .... unbindService(serviceConnection); } }

startService

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

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

  

在这种情况下,服务是否应该被声明为独立流程?

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

  

此外,我的服务启动一个单独的线程,但永远不会停止它。我的代码应该停止线程吗?

如果要停止服务,则应该停止线程,因为线程是GC根,并且可以从中访问的所有对象都将保留在内存中。因此,未使用的无限线程是内存泄漏。

您可以根据需要以不同方式实施线程。您可以在ThreadPoolExecutorHandler()中实施常规线索。选择一个符合您需求的解决方案。