如何在隐藏所有活动时停止/暂停Android服务

时间:2013-11-07 04:14:43

标签: android android-activity android-service android-lifecycle

我正在设计Android应用程序,我正在寻找有关如何实现我认为是常见模式的信息,但我似乎无法在线找到任何有关它的信息。

我将拥有一个包含多项活动的应用程序,所有这些活动都将通过网络与WiFi设备进行通信。所以我的第一个想法是,由于所有活动都需要访问这个中央“网络通信器”,我应该创建一个服务来保存所有的网络通信代码。太好了!

但是现在,我希望能够节省电池寿命,并且通常会使应用程序不那么突兀。如果我的应用程序中没有任何活动可见,那么我不需要运行网络代码,我可以关闭我的套接字并等待。然后,当其中一个活动再次可见时,我可以在那时重新连接。

这是问题 - 我不知道该怎么做!是否存在用于确定何时隐藏我的应用程序中的所有活动的现有方法或模式?每次我的某个活动恢复或创建时,我都不想断开/重新连接,因为大部分时间来自用户在应用程序中导航,在活动之间切换。我希望网络连接一直打开。

我可以在我的服务中加入某种“引用计数”机制来跟踪活动何时出现和消失,但这看起来有点过分。我很惊讶没有现成的机制。

对不起,如果我遗漏了一些简单的事情......

3 个答案:

答案 0 :(得分:0)

您可以使用以下方式进行检查:

public void onPause(){
    super.onPause();
        Context context = getApplicationContext();
                ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
                List<RunningTaskInfo> taskInfo = am.getRunningTasks(1);
                if (!taskInfo.isEmpty()) {
                  ComponentName topActivity = taskInfo.get(0).topActivity; 
                  if (!topActivity.getPackageName().equals(context.getPackageName())) {
                   StopPlayer();
                    Toast.makeText(xYourClassNamex.this, "YOU LEFT YOUR APP. SERVICE STOP", Toast.LENGTH_SHORT).show();
                  }
                }
      }

将上面的代码放在每个Class的Pause()上。只需点击recent applicationhome按钮,您的应用即可back继续播放。现在你可以设置任何偏好而不是这个Toast&amp;停止服务。现在检查每个Class的Resume()的首选项。如果偏好有任何价值,那么你可以开始你的服务。

答案 1 :(得分:0)

模式是将Service绑定到基类Activity,然后从该绑定的Activity继承多个类。

答案 2 :(得分:0)

Bound Service听起来就像你需要的那样:http://developer.android.com/guide/components/bound-services.html#Binder

由于您有多项活动使用同一服务,因此您可以Bind每个服务使用该服务,并Unbind该活动不再需要使用该服务时。这样做的好地方是onStart()onStop() Activity生命周期方法。关于这一点的好处是,当Service检测到没有Activity绑定它时,它会自杀。

进一步阅读:用户hackbodonStart()/onStop()为何选择的绝佳解释:https://stackoverflow.com/a/2304794/1839500