检查Activity是否从Service运行

时间:2012-08-29 06:33:06

标签: android android-activity android-service

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

9 个答案:

答案 0 :(得分:58)

将以下方法与您的包名一起使用。如果您的任何活动都在前台,它将返回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);
}

Update:

添加权限:

<uses-permission android:name="android.permission.GET_TASKS" />

答案 1 :(得分:7)

使用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 :)它基本上都是伏都教

反正 希望能帮到某人

答案 2 :(得分:5)

从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.

执行此操作的一种方法是在app start上绑定到服务。然后: 1.如果您需要检查应用程序的任何活动是否正在运行,您可以为您的活动创建基类并覆盖onPause和onResume。在onPause中,调用服务方法让它知道它在后台。在onResume中,调用一个服务方法让它知道它在前台。 2.如果您只需要对某些特定活动执行此操作,只需在这些活动上覆盖onResume和onPause,或为这些活动创建基本活动。

答案 3 :(得分:3)

如果您的活动具有触发顶部其他活动的某些功能,则上述大部分答案都存在一个缺陷,例如:发送电子邮件

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

答案 4 :(得分:1)

Erian的答案正确,但是使用“ getDefaultSharedPreferences”并不安全。启动服务时,它将使用与活动不同的实例。活动中首选项的任何更改都不会更新服务中的默认共享首选项。因此,我将使用“ .getSharedPreferences”更改Erian代码,如下所示:

活动中:

    @Override
    public void onPause() {
        super.onPause();
        getApplicationContext().getSharedPreferences("preferences", MODE_MULTI_PROCESS).edit().putBoolean("isActive", false).commit();;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        getApplicationContext().getSharedPreferences("preferences", MODE_MULTI_PROCESS).edit().putBoolean("isActive", false).commit();
    }

    @Override
    public void onResume() {
        super.onResume();
        getApplicationContext().getSharedPreferences("preferences", MODE_MULTI_PROCESS).edit().putBoolean("isActive", false).commit();
    }

服务中:

    if (getApplicationContext().getSharedPreferences("preferences", MODE_MULTI_PROCESS).getBoolean("isActive", false)) {
        return;
    }

答案 5 :(得分:0)

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

答案 6 :(得分:0)

使用Android体系结构组件,很容易对此进行检查

annotationProcessor 'android.arch.lifecycle:compiler:1.1.1'
implementation 'android.arch.lifecycle:extensions:1.1.1'

生命周期观察器类,保留一个首选项标志

public class AppLifecycleObserver implements LifecycleObserver {

public static final String TAG = "AppLifecycleObserver";

@OnLifecycleEvent(Lifecycle.Event.ON_START)
void onEnterForeground() {
    Log.d(TAG, "onEnterForeground");
    PreferencesUtils.save(Constants.IN_FOREGROUND, true);
}

@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
void onEnterBackground() {
    Log.d(TAG, "onEnterBackground");
    PreferencesUtils.save(Constants.IN_FOREGROUND, false);
  }
}

应用程序类观察者的生命周期

public class App extends Application {


private static App instance;

public static App getInstance() {
    return instance;
}

@Override
public void onCreate() {
    super.onCreate();

    AppLifecycleObserver appLifecycleObserver = new AppLifecycleObserver();
    ProcessLifecycleOwner.get().getLifecycle().addObserver(appLifecycleObserver);
}

现在,您可以使用Pref标志检查您想要的任何地方。

答案 7 :(得分:0)

getRunningTasks() 已弃用

getRunningTask() 已被 android 弃用,现在我们可以使用 getRunningAppProcesses()。这将返回一个列表或 RunningAppProcessInfo,我们可以在其中检查第一个进程的 importance

查看官方文档了解更多详情:https://developer.android.com/reference/android/app/ActivityManager#getRunningAppProcesses()

代码:

 public boolean isAppInForeground() {
        ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> runningTaskInfo = manager.getRunningAppProcesses();
        if (runningTaskInfo.size() > 0)
            return runningTaskInfo.get(0).importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
        return false; // no running process
    }

答案 8 :(得分:-2)

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

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