检查活动是否从服务运行

Service如何检查其中一个应用程序的Activity是否在前台运行?

Solutions Collecting From Web of "检查活动是否从服务运行"

在包名称中使用下面的方法。 如果您的任何活动在前台,它将返回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" /> 

从棒棒糖开始,不推荐使用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.如果您需要检查应用程序的任何活动正在运行,您可以为您的活动创build一个基类,并覆盖onPause和onResume。 在onPause中,调用一个服务方法让它知道它在后台。 在onResume中,调用服务方法让它知道它在前台。 2.如果您只需要对某些特定活动执行此操作,则只需在这些活动上覆盖onResume和onPause,或为这些活动创build一个基本活动。

上面的大部分答案都有一个缺陷,如果你的活动有一些触发另一个活动的function,例如发送电子邮件

在这里输入图像说明

topActivity不会返回您的包名称,而是返回Android活动select器包的名称。

因此,最好检查一下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; } 

使用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,因为有时它直接跳到o​​nDestroy :)它基本上都是巫术

无论如何,希望帮助别人

我想你可以在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; } 

使用下面的方法获取当前活动的完整类名(包+类名),并检查它是否等于所需活动的完整类名(包+类名):

  public String getCurrentClass() { ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> runningTaskInfo = manager.getRunningTasks(1); ComponentName componentInfo = runningTaskInfo.get(0).topActivity; String className = componentInfo.getClassName(); return className; }