2013-02-26 141 views
6

我有一個涉及聲音池的應用程序 - 在應用程序啓動時,所有聲音都會在加載主屏幕後加載。檢查我的應用程序是否在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

回答

7

我認爲你可以再補充

break; 

下面

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

if聲明

3

只要把斷裂的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

2

這就是你應該做的。

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

這是無關的過早退出循環,因爲所有我們從閱讀的問題想,但是是不是隻將結果輸出一次

+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

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; 
} 
相關問題