Wie kann eine Service
prüfen, ob eine ihrer Anwendungen Activity
im Vordergrund ausgeführt wird?
Verwenden Sie die unten stehende Methode mit Ihrem Paketnamen. Es wird true zurückgegeben, wenn eine Ihrer Aktivitäten im Vordergrund steht.
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);
}
Erlaubnis hinzufügen:
<uses-permission Android:name="Android.permission.GET_TASKS" />
Von Lollipop ausgehend ist getRunningTasks
veraltet:
* <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.
Eine Möglichkeit, dies zu tun, besteht darin, beim Start der App an den Dienst zu binden. Dann: 1. Wenn Sie überprüfen müssen, ob eine Aktivität der App ausgeführt wird, können Sie eine Basisklasse für Ihre Aktivitäten erstellen und onPause und onResume überschreiben. Rufen Sie in onPause eine Servicemethode auf, um sie wissen zu lassen, dass sie sich im Hintergrund befindet. Rufen Sie in onResume eine Servicemethode auf, um sie wissen zu lassen, dass sie sich im Vordergrund befindet .. 2. Wenn Sie dies nur für bestimmte Aktivitäten tun müssen, überschreiben Sie einfach onResume und onPause für diese Aktivitäten oder erstellen Sie eine Basisaktivität für diese Aktivitäten.
Verwenden Sie SharedPreferences, um den Status Ihrer App in onResume, onPause usw. zu speichern.
wie so:
@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();
}
und dann im dienst:
if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("isActive", false)) {
return;
}
ich habe sowohl onPause als auch onDestroy verwendet, weil es manchmal direkt zu onDestroy springt :) es ist im Grunde alles Voodoo
trotzdem, hoffe, das hilft jemandem
Bei den meisten der obigen Antworten liegt ein Fehler vor, wenn Ihre Aktivität über eine Funktion verfügt, die eine andere Aktivität auslöst, z. eine E-Mail senden
topActivity
gibt nicht den Namen Ihres Pakets zurück, sondern den Paketnamen der Android-Aktivitätsauswahl.
Daher ist es besser, nach baseActivity
anstelle von topActivity
zu suchen.
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;
}
Ich denke, Sie können GetRunninTasks auf Android laden und mit Ihrem Paketnamen überprüfen, ob die Task ausgeführt wird oder nicht.
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;
}