Answers:
您可以static在活动中使用变量。
class MyActivity extends Activity {
     static boolean active = false;
      @Override
      public void onStart() {
         super.onStart();
         active = true;
      } 
      @Override
      public void onStop() {
         super.onStop();
         active = false;
      }
}
唯一的陷阱是,如果在两个相互链接的活动中使用它,onStop则有时onStart在第二个活动中调用第一个活动。因此,两者可能短暂地是对的。
根据您要执行的操作(从服务中更新当前活动?)。您可以使用活动onStart方法在服务中注册一个静态侦听器,然后当您的服务要更新UI时正确的侦听器将可用。
MyActivity与MyChildactivity孩子接触并想检查孩子是否活跃,该怎么办?
                    我认为这样更清楚:
  public boolean isRunning(Context ctx) {
        ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);
        for (RunningTaskInfo task : tasks) {
            if (ctx.getPackageName().equalsIgnoreCase(task.baseActivity.getPackageName())) 
                return true;                                  
        }
        return false;
    }
              不使用任何辅助变量的选项是:
activity.getWindow().getDecorView().getRootView().isShown()
活动是fe的地方:this或getActivity()。
此表达式返回的值在onStart()/ onStop()中发生更改,这些事件是开始/停止显示电话上的活动布局的事件。
Activity#getWindow().getDecorView().isShown()?
                    我使用了MyActivity.class和getCanonicalName方法,并得到了答案。
protected Boolean isActivityRunning(Class activityClass)
{
        ActivityManager activityManager = (ActivityManager) getBaseContext().getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);
        for (ActivityManager.RunningTaskInfo task : tasks) {
            if (activityClass.getCanonicalName().equalsIgnoreCase(task.baseActivity.getClassName()))
                return true;
        }
        return false;
}
              getRunningTasks(),因为它已被否决:androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/...
                    比使用静态变量并遵循OOP更好的方法
Shared Preferences可用于与他人共享变量,activities并从一个共享服务application
    public class example extends Activity {
    @Override
    protected void onStart() {
        super.onStart();
        // Store our shared preference
        SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE);
        Editor ed = sp.edit();
        ed.putBoolean("active", true);
        ed.commit();
    }
    @Override
    protected void onStop() {
        super.onStop();
        // Store our shared preference
        SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE);
        Editor ed = sp.edit();
        ed.putBoolean("active", false);
        ed.commit();
    }
}
使用共享的首选项。它具有最可靠的状态信息,减少了应用程序切换/销毁问题,使我们不必再寻求其他权限,并且它使我们可以更好地控制何时确定活动实际上是最高的。看细节了这里 ABD 这里还
onStop()
                    这是用于检查特定服务是否正在运行的代码。我相当确定,只要您使用getRunningAppProcesses()或getRunningTasks()更改getRunningServices,它也可以对活动起作用。在这里看看http://developer.android.com/reference/android/app/ActivityManager.html#getRunningAppProcesses()
相应地更改Constants.PACKAGE和Constants.BACKGROUND_SERVICE_CLASS
    public static boolean isServiceRunning(Context context) {
    Log.i(TAG, "Checking if service is running");
    ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);
    boolean isServiceFound = false;
    for (int i = 0; i < services.size(); i++) {
        if (Constants.PACKAGE.equals(services.get(i).service.getPackageName())){
            if (Constants.BACKGROUND_SERVICE_CLASS.equals(services.get(i).service.getClassName())){
                isServiceFound = true;
            }
        }
    }
    Log.i(TAG, "Service was" + (isServiceFound ? "" : " not") + " running");
    return isServiceFound;
}
              有一种比上面所有方法都简单得多的方法,该方法不需要android.permission.GET_TASKS在清单中使用,或者在公认的答案中指出了竞争条件或内存泄漏的问题。
在主活动中创建一个STATIC变量。静态允许其他活动从另一个活动接收数据。onPause()将此变量设置为false,onResume并将onCreate()此变量设置为true。
private static boolean mainActivityIsOpen;分配此变量的获取器和设置器。
public static boolean mainActivityIsOpen() {
    return mainActivityIsOpen;
}
public static void mainActivityIsOpen(boolean mainActivityIsOpen) {
    DayView.mainActivityIsOpen = mainActivityIsOpen;
}然后从另一个活动或服务
if (MainActivity.mainActivityIsOpen() == false)
{
                //do something
}
else if(MainActivity.mainActivityIsOpen() == true)
{//or just else. . . ( or else if, does't matter)
        //do something
}if(!activity.isFinishing() && !activity.isDestroyed())
从官方文档:
检查此活动是否正在完成中,这是因为您在该活动上调用了finish()还是其他人已要求完成该活动。通常在onPause()中使用它来确定活动是只是暂停还是完全结束。
如果对Activity进行了最后的onDestroy()调用,则返回true,因此该实例现在已失效。
谢谢kkudi!我能够调整您的答案以使其适合某项活动……这就是我的应用程序中有效的方法。
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; 
} 
如果topActivity与用户正在执行的操作匹配,则此示例将为true或false。因此,如果未显示您所检查的活动(即onPause),那么您将不会获得匹配。另外,要执行此操作,您需要将权限添加到清单中。
<uses-permission  android:name="android.permission.GET_TASKS"/>
我希望这可以帮到你!
我认为公认的答案是处理此问题的一种糟糕方法。
我不知道用例是什么,但是请在基类中考虑一个受保护的方法
@protected
void doSomething() {
}
并在派生类中重写它。
事件发生时,只需在基类中调用此方法。正确的“活动”类将对其进行处理。然后,类本身可以检查是否不是Paused()。
更重要的是,使用一个事件像公交车GreenRobot的,方形的,而是一个已被弃用,并使用建议RxJava
ActivityLifecycleCallbacks是跟踪App中所有活动的好方法:
public class BaseActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks {
private ActivityState homeState, contentState;
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.CREATED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.CREATED;
    }
}
@Override
public void onActivityStarted(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.STARTED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.STARTED;
    }
}
@Override
public void onActivityResumed(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.RESUMED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.RESUMED;
    }
}
@Override
public void onActivityPaused(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.PAUSED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.PAUSED;
    }
}
@Override
public void onActivityStopped(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.STOPPED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.STOPPED;
    }
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}
@Override
public void onActivityDestroyed(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.DESTROYED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.DESTROYED;
    }
}
public ActivityState getHomeState() {
    return homeState;
}
public ActivityState getContentState() {
    return contentState;
}
}
活动状态:
public enum ActivityState {
    CREATED, STARTED, RESUMED, PAUSED, STOPPED, DESTROYED;
}
扩展Application类,并在Android Manifest文件中提供其引用:
import android.app.Application;
public final class BaseApplication extends Application {
private BaseActivityLifecycleCallbacks baseALC;
@Override
public void onCreate() {
    super.onCreate();
    baseALC = new BaseActivityLifecycleCallbacks();
    this.registerActivityLifecycleCallbacks(baseALC);
}
public BaseActivityLifecycleCallbacks getBaseALC() {
    return baseALC;
}
}
在“活动”中的任意位置查看其他活动的状态:
private void checkAndLaunchHomeScreen() {
    Application application = getApplication();
    if (application instanceof BaseApplication) {
        BaseApplication baseApplication = (BaseApplication) application;
        if (baseApplication.getBaseALC().getHomeState() == null || baseApplication.getBaseALC().getHomeState() == ActivityState.DESTROYED) {
            //Do anything you want
        }
    }
}
https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html
使用有序广播。参见http://android-developers.blogspot.nl/2011/01/processing-ordered-broadcasts.html
在您的活动中,在onStart中注册一个接收者,在onStop中注销。现在,例如,当服务需要处理活动可能能够做得更好的事情时,请从服务发送有序广播(服务本身具有默认处理程序)。现在,您可以在活动运行时对其进行响应。该服务可以检查结果数据,以查看是否处理了广播,如果没有,请采取适当的措施。
除了可接受的答案外,如果您有活动的多个实例,则可以使用计数器来代替:
class MyActivity extends Activity {
     static int activeInstances = 0;
     static boolean isActive() {
        return (activeInstance > 0)
     }
      @Override
      public void onStart() {
         super.onStart();
         activeInstances++;
      } 
      @Override
      public void onStop() {
         super.onStop();
         activeInstances--;
      }
}
              使用以下代码找到了一个简单的解决方法
@Override 
protected void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { 
                // Activity is being brought to front and not being  created again, 
                // Thus finishing this activity will bring the last viewed activity to foreground
                finish(); 
            } 
    }
              使用isActivity变量检查活动是否有效。
private boolean activityState = true;
 @Override
protected void onDestroy() {
    super.onDestroy();
    activityState = false;
}
然后检查
if(activityState){
//add your code
}
              如果要检查活动是否在堆栈中,请执行以下步骤。1.在Application类中声明一个ArrayList [Application类在application标签的mainfest文件中定义]
private ArrayList<Class> runningActivities = new ArrayList<>();
并添加以下公共方法来访问和修改此列表。
public void addActivityToRunningActivityies (Class cls) {
if (!runningActivities.contains(cls)) runningActivities.add(cls);
}
public void removeActivityFromRunningActivities (Class cls) {
if (runningActivities.contains(cls)) runningActivities.remove(cls);
}
public boolean isActivityInBackStack (Class cls) {
return runningActivities.contains(cls);
}在所有活动将其扩展的BaseActivity中,重写onCreate和onDestroy方法,以便您可以按如下所示从后堆栈中添加和删除活动。
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((MyApplicationClass)getApplication()).addActivityToRunningActivityies
(this.getClass());
}
@Override
protected void onDestroy() {
super.onDestroy();
((MyApplicationClass)getApplication()).removeActivityFromRunningActivities
(this.getClass());
}最后,如果要检查活动是否在后堆栈中,则只需调用此函数isActivityInBackStack。
例如:我想检查HomeActivity是否在后堆栈中:
if (((MyApplicationClass) 
getApplication()).isActivityInBackStack(HomeActivity.class)) {
       // Activity is in the back stack
    } else {
       // Activity is not in the back stack
    }
              public static boolean isActivityActive(Activity activity) {
    return !activity.isFinishing() &&
            (SDK_INT < JELLY_BEAN_MR1 || !activity.isDestroyed());
}
              如果您在前台没有相同的活动,则可以进行此工作。如果您从通知中打开不起作用,我会进行一些调整并附带以下内容:
public static boolean ativo = false;
public static int counter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    counter++;
}
@Override
protected void onStart() {
    super.onStart();
    ativo = true;
}
@Override
protected void onStop() {
    super.onStop();
    if (counter==1) ativo = false;
}
@Override
protected void onDestroy() {
    counter--;
    super.onDestroy();
}
这对我有效,同时有几个活动。