6

我有一个涉及声音池的应用程序 - 在应用程序启动时加载所有声音,然后加载主屏幕。

现在,我想检查应用程序是否正在运行——如果没有运行,我想重新加载应用程序——如果它正在运行,我不想重新加载应用程序。

为此,我尝试了以下方法:

 ActivityManager activityManager = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE );
 List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
 for(int i = 0; i < procInfos.size(); i++){
   if(procInfos.get(i).processName.equals("com.me.checkprocess"))
   {
    Log.e("Result", "App is running - Doesn't need to reload");
   }
   else
   {
     Log.e("Result", "App is not running - Needs to reload);
  }
}

这可以完美地给出结果,但会继续检查直到 procInfos.size 小于 0。直到应用程序获取进程 com.me.checkprocess 为真 - 它总是错误的?所以它总是首先进入 else 部分。

例如:如果总进程是 30。而我的进程 com.me.checkprocess 正在运行@29th。执行条件时。直到第 28 个进程它是 else 并且 @29th 进程它进入条件为真。

如何修复这部分 - 我只想在检查整个过程后才能进入其他部分?

让我知道!

4

5 回答 5

7

我想你可以添加

break;

以下

Log.e("Result", "App is running - Doesn't need to reload");

if声明中

于 2013-02-26T09:53:31.813 回答
3

只需在 for 循环中放置一个 break 即可。

 for(...){
    if(){
       break;
    } 
 }

这绝对不干净,但可以做你想做的事。

**编辑 2

我认为如果你只是在一个方法中提取这个任务会更容易。

public boolean isProcessRunning(String process) {
    ActivityManager activityManager = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE );
    List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
    for(int i = 0; i < procInfos.size(); i++){
        if (procInfos.get(i).processName.equals(process)) {
            return true;
        }  
    }
    return false;
}

public static void main(String[] args) {
    if (isProcessRunning("my_process")) {
        // Do what you need
    } else {
        // restart your app
    }
}
于 2013-02-26T09:54:23.323 回答
2

这是你应该做的。

   if(procInfos.get(i).processName.equals("com.me.checkprocess"))
   {
    Log.e("Result", "App is running - Doesn't need to reload");
    break;
   }
于 2013-02-26T09:54:31.770 回答
2

其他列出的答案将起作用,但我同意 c4pone - 在这样的循环中,break 似乎是一种不好的方法 - 特别是使用一种break方法,如果您在 if 语句周围添加另一个条件,则有可能退出循环时break可能不再起作用for- 在某些方面它类似于goto其他语言中的语句

您的问题的另一种选择是:

for(int i = 0; i < procInfos.size(); i++){
   if(procInfos.get(i).processName.equals("com.me.checkprocess"))
   {
        Log.e("Result", "App is running - Doesn't need to reload");
        i = procInfos.size();
   }
   else
   {
        Log.e("Result", "App is not running - Needs to reload);
   }
}

这也将中断循环,因为它将您的计数器变量设置为终止子句,这意味着一旦找到它,循环将退出。

编辑:

在下面OP的评论之后,我有一种感觉,他想要的解决方案是这样的:

boolean found = false;
for(int i = 0; i < procInfos.size(); i++){
   if(procInfos.get(i).processName.equals("com.me.checkprocess"))
   {
       found = true;
   }
}

if(found)
{
    Log.e("Result", "App is running - Doesn't need to reload");
    i = procInfos.size();
}
else
{
    Log.e("Result", "App is not running - Needs to reload);
}

正如我们所有人在阅读问题时所想的那样,这与过早退出循环无关,而是只输出一次结果

于 2013-02-26T10:39:54.907 回答
0
 public static boolean isAppRunning(Context context) {

// 检查返回的任务列表中的第一个任务(前台任务)

  ActivityManager activityManager = (ActivityManager)
 context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> services =
activityManager.getRunningTasks(Integer.MAX_VALUE);
 if
 (services.get(0).topActivity.getPackageName().toString().equalsIgnoreCase(context.getPackageName().toString()))
 {
 return true;
 }
 return false;
 }
于 2016-03-28T08:43:18.283 回答