web-dev-qa-db-ja.com

アクティビティがサービスから実行されているかどうかを確認します

Serviceは、アプリケーションのActivityのいずれかがフォアグラウンドで実行されているかどうかをどのように確認できますか?

40
Taranfx

パッケージ名に以下の方法を使用します。アクティビティのいずれかがフォアグラウンドにある場合、trueを返します。

public boolean isForeground(String myPackage) {
    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> runningTaskInfo = manager.getRunningTasks(1); 
    ComponentName componentInfo = runningTaskInfo.get(0).topActivity;
    return componentInfo.getPackageName().equals(myPackage);
}

更新:

許可を追加:

<uses-permission Android:name="Android.permission.GET_TASKS" />
60
Rasel

SharedPreferencesを使用して、アプリのステータスをonResume、onPauseなどに保存します。

そのようです:

 @Override
public void onPause() {
    super.onPause();
    PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("isActive", false).commit();
}

@Override
public void onDestroy() {
    super.onDestroy();
    PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("isActive", false).commit();
}

@Override
public void onResume() {
    super.onResume();
    PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("isActive", true).commit();
}

そしてサービスで:

if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("isActive", false)) {
            return;
}

onPauseとonDestroyの両方を使用したのは、onDestroyに直接ジャンプする場合があるためです。基本的にはすべてブードゥー教です。

とにかく、それが誰かを助けることを願っています

9
eiran

Lollipop以降、getRunningTasksは非推奨です:

 * <p><b>Note: this method is only intended for debugging and presenting
 * task management user interfaces</b>.  This should never be used for
 * core logic in an application, such as deciding between different
 * behaviors based on the information found here.</p>
 *
 * @deprecated As of {@link Android.os.Build.VERSION_CODES#Lollipop}, this method
 * is no longer available to third party applications.

これを行う1つの方法は、アプリの起動時にサービスにバインドすることです。次に:1.アプリのアクティビティの実行を確認する必要がある場合、アクティビティの基本クラスを作成し、onPauseとonResumeをオーバーライドできます。 onPauseで、サービスメソッドを呼び出して、バックグラウンドにあることを通知します。 onResumeで、サービスメソッドを呼び出して、フォアグラウンドにあることを通知します。 2.特定のアクティビティでのみこれを行う必要がある場合は、それらのアクティビティでonResumeおよびonPauseをオーバーライドするか、それらのアクティビティのベースアクティビティを作成します。

6
Comtaler

アクティビティに、他のアクティビティをトップからトリガーする機能がある場合、上記の回答のほとんどに1つの欠陥があります。メールを送る

enter image description here

topActivityはパッケージ名を返しませんが、代わりにAndroidアクティビティセレクターパッケージ名)を返します。

したがって、baseActivityではなくtopActivityを確認することをお勧めします。

public boolean isMainActivityRunning(String packageName) {
    ActivityManager activityManager = (ActivityManager) getSystemService (Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> tasksInfo = activityManager.getRunningTasks(Integer.MAX_VALUE); 

    for (int i = 0; i < tasksInfo.size(); i++) {
        if (tasksInfo.get(i).baseActivity.getPackageName().toString().equals(packageName)
            return true;
    }

    return false;
} 
3
ForceMagic

AndroidでRunninTasksを取得し、タスクが実行中かどうかをパッケージ名で確認できると思います。

public boolean isServiceRunning() { 

ActivityManager activityManager = (ActivityManager)Monitor.this.getSystemService (Context.ACTIVITY_SERVICE); 
List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE); 
isServiceFound = false; 
for (int i = 0; i < services.size(); i++) { 
    if (services.get(i).topActivity.toString().equalsIgnoreCase("ComponentInfo{com.lyo.AutoMessage/com.lyo.AutoMessage.TextLogList}")) {
        isServiceFound = true;
    }
} 
return isServiceFound; 
} 
0
VendettaDroid