1

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

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

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

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

我可以在我的服务中放置某种“引用计数”机制来跟踪活动何时出现和消失,但这似乎有点矫枉过正。我很惊讶没有现有的机制来解决这个问题。

对不起,如果我错过了一些简单的东西......

4

3 回答 3

0

Bound Service听起来正是您所需要的:http: //developer.android.com/guide/components/bound-services.html#Binder

由于您有多个 Activity 使用同一个服务,您可以将Bind每个 Activity 分配给该服务,并Unbind在该 Activity 不再需要使用该服务时。一个很好的地方是在你的onStart()onStop() Activity生命周期方法中。这样做的好处是,当Service检测到它没有Activity绑定时,它会杀死自己。

进一步阅读:用户hackbod很好地解释了为什么onStart()/onStop()是一个不错的选择:https ://stackoverflow.com/a/2304794/1839500

于 2014-12-02T03:56:00.403 回答
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 application当您的应用程序通过单击homeback按钮继续运行时,它将敬酒。现在您可以设置任何首选项而不是此 Toast 并停止服务。现在检查您对每个班级的 Resume() 的偏好。如果偏好有任何价值,那么您可以启动您的服务。

于 2013-11-07T04:36:46.247 回答
0

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

于 2013-11-07T04:40:10.143 回答