我正处于为Android编写回合制游戏的开始阶段。目前,我计划让它成为单人游戏,玩家可以在这里扮演AI角色。这将是一个相当复杂的游戏,并且由于它是回合制的,所以在玩家每转一圈之后必须进行大量的计算和工作(AI每个人都要计算并且"采取他们轮到了#34;)。我目前正在考虑在service
中完成所有工作。一旦玩家结束他们的回合,应用程序主要活动将创建一个新服务。该服务将对AI进行所有计算(在与主Activity的单独线程中),主Activity将显示一些加载动画,表明AI玩家正在思考。"
我想采用这种方法的原因是,如果用户关闭应用程序,而AI仍在"轮到他们,"即使主要活动被系统杀死,服务仍然可以进行所有计算。
我还在梳理很多细节,但我遇到了一些问题。考虑用户结束轮到他们,创建并启动服务的情况,并且当服务愉快地运行时,用户关闭应用程序,应用程序的主要活动被系统销毁,然后用户决定再次打开应用程序。当应用程序打开时,需要执行以下操作:
所以我有以下问题:
*我已经看到类似问题的一些答案,建议使用全局变量,但是因为无数教授和同事一次又一次地告诉我,尽可能地避免全局变量,我试图看看是否有更优雅的解决方案。
答案 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"));