6

サウンドプールを含むアプリケーションがあります-アプリケーションの起動時にすべてのサウンドがロードされ、その後メイン画面がロードされます。

ここで、アプリケーションが実行されているかどうかを確認します。実行されていない場合は、アプリケーションをリロードします。実行されている場合は、アプリケーションをリロードしません。

私は次のことを試しました:

 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をtrueにするまで、常にfalseですか?したがって、常に最初にelse部分に入ります。

たとえば、プロセスの合計が30の場合、プロセスcom.me.checkprocessは@29thで実行されます。条件を実行するとき。28番目のプロセスまではelseであり、@29番目のプロセスまではtrueの状態になります。

この部分を修正する方法-プロセス全体がチェックされた後にのみ他の部分に移動したいですか?

お知らせ下さい!

4

5 に答える 5

7

追加できると思います

break;

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

if声明で

于 2013-02-26T09:53:31.813 に答える
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
    }
}
于 2013-02-26T09:54:23.323 に答える
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);
}

私たち全員が質問を読んで考えたように、時期尚早にループを終了することとは何の関係もありませんが、代わりに結果を一度だけ出力することです

于 2013-02-26T10:39:54.907 に答える
2

これはあなたがすべきことです。

   if(procInfos.get(i).processName.equals("com.me.checkprocess"))
   {
    Log.e("Result", "App is running - Doesn't need to reload");
    break;
   }
于 2013-02-26T09:54:31.770 に答える
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;
 }
于 2016-03-28T08:43:18.283 に答える