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

问题描述:

我有一个涉及声音池的应用程序 - 在应用程序启动时,所有声音都会在加载主屏幕后加载。检查我的应用程序是否在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直到应用程序获取过程com.me.checkprocess真的 - 这总是假的?所以它总是首先进入其他部分。

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

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

让我知道!

+2

使用'break;'语句。 – 2013-02-26 09:52:35

+0

此行末尾缺少引号'Log.e(“Result”,“App is not running - Needs to reload);' – 2013-11-18 12:13:31

我认为你可以再补充

break; 

下面

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

if声明

只要把断裂的for循环中。

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

那么更干净的方式是什么? – 2013-02-26 09:55:14

+0

@HarryJoy”clean“是主观的。宁愿打破一个复杂的终止条件或一个布尔变量的结构 – Henry 2013-02-26 09:58:18

+0

@亨利是啊我明白了你的观点,但实际上我是诚实地问,如果* c4pone *还有一些更干净的方式来做到这一点,然后休息。 – 2013-02-26 10:07:19

这就是你应该做的。

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

的其他上市答案的工作,但我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); 
} 

这是无关的过早退出循环,因为所有我们从阅读的问题想,但是是不是只将结果输出一次

+0

再次。这直接转到其他部分,然后转到部分。因此,例如,如果总进程是30 ..和“com.me.checkprocess”在29日运行 - 直到28日,应用程序将转到其他部分(“需要重新加载”),然后@ 29日它会说真的没有'吨需要重新加载。 – TheDevMan 2013-02-26 10:48:35

+0

当然会。在这一点上,我怀疑你还没有很好地解决你原来的问题。你希望else子句只执行一次吗?如果是这样,我编辑了我的答案给你一个解决方案 – 2013-02-26 10:50:34

+0

是的。情况就是这样。对不起,错误的沟通。我也正确编辑了这个问题。 其他部分只有当进程不存在时才会发生。并非每次都在这个过程中。 我的代码或你的代码总是去其他部分然后去如果部分。 – TheDevMan 2013-02-26 10:53:40

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