Service
は、アプリケーションのActivity
のいずれかがフォアグラウンドで実行されているかどうかをどのように確認できますか?
パッケージ名に以下の方法を使用します。アクティビティのいずれかがフォアグラウンドにある場合、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" />
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に直接ジャンプする場合があるためです。基本的にはすべてブードゥー教です。
とにかく、それが誰かを助けることを願っています
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をオーバーライドするか、それらのアクティビティのベースアクティビティを作成します。
アクティビティに、他のアクティビティをトップからトリガーする機能がある場合、上記の回答のほとんどに1つの欠陥があります。メールを送る
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;
}
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;
}