Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android中管理服务_Java_Android_Android Activity_Android Service - Fatal编程技术网

Java 在Android中管理服务

Java 在Android中管理服务,java,android,android-activity,android-service,Java,Android,Android Activity,Android Service,我正处于为Android编写基于回合的游戏的开始阶段。目前,我打算让它成为单人游戏,玩家可以和AI游戏。这将是一个相当复杂的游戏,因为它是基于回合的,玩家每次回合后都要做大量的计算和工作(AI的每个人都要计算并“轮到他们”)。我现在很乐意在服务中完成所有这些工作。一旦玩家结束回合,应用程序主活动将创建一个新服务。该服务将完成AI的所有计算(在主活动的单独线程中),主活动将显示一些加载动画,表明AI玩家正在“思考” 我之所以想采用这种方法,是因为如果用户在AI仍在“轮到他们”的时候关闭应用程序,即

我正处于为Android编写基于回合的游戏的开始阶段。目前,我打算让它成为单人游戏,玩家可以和AI游戏。这将是一个相当复杂的游戏,因为它是基于回合的,玩家每次回合后都要做大量的计算和工作(AI的每个人都要计算并“轮到他们”)。我现在很乐意在
服务中完成所有这些工作。一旦玩家结束回合,应用程序主活动将创建一个新服务。该服务将完成AI的所有计算(在主活动的单独线程中),主活动将显示一些加载动画,表明AI玩家正在“思考”

我之所以想采用这种方法,是因为如果用户在AI仍在“轮到他们”的时候关闭应用程序,即使主要活动被系统终止,服务仍能完成所有计算

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

  • 主要活动需要检查并查看服务是否仍在运行,以及是否
  • 一旦服务完成其工作,它需要告诉主活动(前提是用户重新打开应用程序且主活动当前正在运行),在销毁之前它已完成
因此,我有以下问题:

  • 我的活动是否有办法检查并查看服务是否仍在运行*
  • 是否有一种方法可以让服务告诉主活动它已经完成,而不必轮询主活动
  • *我已经看到一些类似问题的答案,建议使用全局变量,但由于无数教授和同事一再告诉我要尽可能避免使用全局变量,我正在尝试看看是否有更优雅的解决方案

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

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

    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;
    }
    
    活动中

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