在Android中管理服务

时间:2017-01-18 05:14:21

标签: java android android-activity android-service

我正处于为Android编写回合制游戏的开始阶段。目前,我计划让它成为单人游戏,玩家可以在这里扮演AI角色。这将是一个相当复杂的游戏,并且由于它是回合制的,所以在玩家每转一圈之后必须进行大量的计算和工作(AI每个人都要计算并且"采取他们轮到了#34;)。我目前正在考虑在service中完成所有工作。一旦玩家结束他们的回合,应用程序主要活动将创建一个新服务。该服务将对AI进行所有计算(在与主Activity的单独线程中),主Activity将显示一些加载动画,表明AI玩家正在思考。"

我想采用这种方法的原因是,如果用户关闭应用程序,而AI仍在"轮到他们,"即使主要活动被系统杀死,服务仍然可以进行所有计算。

我还在梳理很多细节,但我遇到了一些问题。考虑用户结束轮到他们,创建并启动服务的情况,并且当服务愉快地运行时,用户关闭应用程序,应用程序的主要活动被系统销毁,然后用户决定再次打开应用程序。当应用程序打开时,需要执行以下操作:

  • 主要活动需要检查并查看服务是否仍在运行,以及是否...
  • 一旦服务完成其工作,它需要告诉主要活动(如果用户重新打开应用程序并且主要活动当前正在运行),它将在销毁之前完成。

所以我有以下问题:

  1. 我的活动是否有办法检查服务是否仍在运行?*
  2. 服务是否有办法告诉主要活动它已完成,主要活动是否必须进行轮询?
  3. *我已经看到类似问题的一些答案,建议使用全局变量,但是因为无数教授和同事一次又一次地告诉我,尽可能地避免全局变量,我试图看看是否有更优雅的解决方案。

1 个答案:

答案 0 :(得分:0)

  

我的活动是否有办法检查服务是否仍在运行?*

以下是我找到的解决方案之一

private boolean isMyServiceRunning(Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
    if (serviceClass.getName().equals(service.service.getClassName())) {
        return true;
    }
}
return false;
}

循环遍历所有正在运行的服务,如果找到您的服务则返回true

  

服务是否有办法告诉主要活动它已完成,主要活动是否必须进行轮询?

为此,您可以使用LocalBroadcastManager。当服务即将停止从服务发送LocalBroadcast并在您想要的LocalBroadcastManager中收听Activity

Service

LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("SERVICE_STOPPED"))

Activity

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override public void onReceive(Context context, Intent intent) {
                   //task to do on service stop event 
    }
};
LocalBroadcastManager.getInstance(context).registerReceiver(broadcastReceiver, new IntentFilter("SERVICE_STOPPED"));