检查活动从服务运行(Check if Activity is running from Servic

2019-06-27 12:42发布

一个如何能Service检查,如果它的一个应用程序的Activity是在前台运行?

Answer 1:

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


Answer 2:

使用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 :)它基本上所有的巫术

无论如何,希望可以帮助别人



Answer 3:

从棒棒糖开始, 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.如果您需要检查的任何应用程序的活动的运行,你可以创建一个基类的活动,覆盖的onPause和的onResume。 在的onPause,呼叫服务方法,让它知道它的背景。 在的onResume,呼叫服务方法,让它知道它是在前台。 2.如果你只需要做到这一点就一些具体的活动,只是覆盖的onResume和的onPause这些活动或为这些活动建立一个基地活动。



Answer 4:

有一个缺陷,以大部分的答案上面,如果你的活动有一定的功能,过顶触发其他活动,例如发送电子邮件

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;
} 


Answer 5:

我想你可以在Android getRunninTasks,并检查你的包名,如果正在运行的任务或没有。

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; 
} 


Answer 6:

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

 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;
 }


文章来源: Check if Activity is running from Service