【问题标题】:Managing Services in Android在 Android 中管理服务
【发布时间】:2017-01-18 05:14:20
【问题描述】:

我正处于为 Android 编写回合制游戏的初期阶段。目前,我正计划让它成为单人游戏,玩家与 AI 对抗。这将是一个相当复杂的游戏,而且由于它是回合制的,所以在玩家每回合之后必须进行大量的计算和工作(每个 AI 都必须计算并“轮到他们”)。我目前正在考虑在service 中完成所有这些工作。一旦玩家结束他们的回合,应用程序的主要活动将创建一个新服务。该服务将为 AI 执行所有计算(在与主 Activity 不同的线程中),主 Activity 将显示一些加载动画,表明 AI 玩家正在“思考”。

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

我仍在整理很多细节,但我遇到了一些问题。考虑用户结束自己的回合,创建并启动服务,当服务愉快运行时,用户关闭应用程序,应用程序的主要活动被系统销毁,然后用户决定打开应用程序再次。当应用打开时,需要进行以下操作:

  • 主要activity需要检查服务是否还在运行,如果是...
  • 一旦服务完成其工作,它需要在销毁之前告知主 Activity(假设用户重新打开应用并且主 Activity 当前正在运行)它已完成。

所以我有以下问题:

  1. 有没有办法让我的活动检查服务是否仍在运行?*
  2. 服务有没有办法告诉主要活动它已完成,而不必轮询主要活动?

*我已经看到了一些建议使用全局变量的类似问题的答案,但是由于无数教授和同事一次又一次地告诉我要尽可能避免使用全局变量,所以我正在尝试看看是否有更优雅的解决方案。

【问题讨论】:

    标签: java android android-activity android-service


    【解决方案1】:

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

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

    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,并在Activity 中监听你想要的LocalBroadcastManager

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

    【讨论】:

      猜你喜欢
      • 2018-10-24
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 2014-09-03
      相关资源
      最近更新 更多