检查我的应用程序是否在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个过程。
如何解决这部分 - 我想只有在检查整个过程后才能到其他部分?
让我知道!
我认为你可以再补充
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
}
}
那么更干净的方式是什么? – 2013-02-26 09:55:14
@HarryJoy”clean“是主观的。宁愿打破一个复杂的终止条件或一个布尔变量的结构 – Henry 2013-02-26 09:58:18
@亨利是啊我明白了你的观点,但实际上我是诚实地问,如果* 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);
}
这是无关的过早退出循环,因为所有我们从阅读的问题想,但是是不是只将结果输出一次
再次。这直接转到其他部分,然后转到部分。因此,例如,如果总进程是30 ..和“com.me.checkprocess”在29日运行 - 直到28日,应用程序将转到其他部分(“需要重新加载”),然后@ 29日它会说真的没有'吨需要重新加载。 – TheDevMan 2013-02-26 10:48:35
当然会。在这一点上,我怀疑你还没有很好地解决你原来的问题。你希望else子句只执行一次吗?如果是这样,我编辑了我的答案给你一个解决方案 – 2013-02-26 10:50:34
是的。情况就是这样。对不起,错误的沟通。我也正确编辑了这个问题。 其他部分只有当进程不存在时才会发生。并非每次都在这个过程中。 我的代码或你的代码总是去其他部分然后去如果部分。 – 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;
}
使用'break;'语句。 – 2013-02-26 09:52:35
此行末尾缺少引号'Log.e(“Result”,“App is not running - Needs to reload);' – 2013-11-18 12:13:31