检查我的应用程序是否在Android中运行

时间:2013-02-26 09:49:51

标签: android

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

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

我尝试了以下内容:

 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.直到app获得进程com.me.checkprocess为true - 它总是假的?所以它总是首先进入其他部分。

所以例如:如果总进程是30.而我的进程com.me.checkprocess正在运行@ 29th。执行条件时。直到第28个进程才是其他和@ 29进程,它进入条件为真。

如何解决这个问题 - 我想在检查整个过程后才能找到其他部分?

让我知道!

5 个答案:

答案 0 :(得分:7)

我认为你可以添加

break;

以下

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

if声明中

答案 1 :(得分:3)

在for-loop中暂停一下。

 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
    }
}

答案 2 :(得分:2)

这就是你应该做的。

   if(procInfos.get(i).processName.equals("com.me.checkprocess"))
   {
    Log.e("Result", "App is running - Doesn't need to reload");
    break;
   }

答案 3 :(得分:2)

其他列出的答案可行,但我同意c4pone - 在这样的循环中,中断似乎是一种不好的方法 - 特别是使用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);
}

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

答案 4 :(得分: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;
 }