我有一个涉及声音池的应用程序 - 在应用程序启动时加载所有声音,然后加载主屏幕。
现在,我想检查应用程序是否正在运行 - 如果没有运行我想重新加载应用程序 - 如果它正在运行我不想重新加载应用程序。
我尝试了以下内容:
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进程,它进入条件为真。
如何解决这个问题 - 我想在检查整个过程后才能找到其他部分?
让我知道!
答案 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;
}