Android:如何检查活动是否正在运行?

有没有简单的方法来确定某个活动是否活动? 我想根据哪些活动是活跃的做某些事情。 例如:

if(activityrunning == activity1) //do this else if (activityrunning == activity2) //do something else 

您可以在活动中使用staticvariables。

 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在第一个onStop有时在onStart之后被调用。 所以两者可能都是简单的。

取决于你正在尝试做什么(更新服务中的当前活动?)。 您可以在您的活动onStart方法中在服务中注册静态侦听器,然后当您的服务想要更新UI时,正确的侦听器将可用。

我觉得更清楚的是这样的:

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

比使用静态variables和OOP更好的方法

Shared Preferences可用于从一个application与其他activities和服务共享variables

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

使用共享首选项。 它具有最可靠的状态信息,减less了应用程序切换/销毁问题,节省了我们再次请求许可,并使我们能够更好地控制,以确定我们的活动实际上是什么时候最上层。 在 这里也看到详细信息

这是检查特定服务是否正在运行的代码。 我相当肯定,只要您使用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; } 

我使用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; } 

不使用任何辅助variables的选项是:

 Activity#getWindow().getDecorView().getRootView().isShown() 

此expression式返回的值在onStart()/ onStop()中更改,这些事件是开始/停止显示手机活动布局的事件。

感谢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's , Square's这样的事件总线,但是这个已经被弃用了,build议使用RxJava

有一个比上述所有更简单的方法,这种方法不需要在清单中使用android.permission.GET_TASKS ,或者在接受的答案中指出竞争条件或内存泄漏的问题。

  1. 在主Activity中创build一个STATICvariables。 静态允许其他活动接收来自其他活动的数据。 onPause()将此variables设置为falseonResumeonCreate()将此variables设置为true

     private static boolean mainActivityIsOpen; 
  2. 分配这个variables的getter和setter。

     public static boolean mainActivityIsOpen() { return mainActivityIsOpen; } public static void mainActivityIsOpen(boolean mainActivityIsOpen) { DayView.mainActivityIsOpen = mainActivityIsOpen; } 
  3. 然后从另一个活动或服务

     if (MainActivity.mainActivityIsOpen() == false) { //do something } else if(MainActivity.mainActivityIsOpen() == true) {//or just else. . . ( or else if, does't matter) //do something } 

不知道这是“做事”的“正确”方式。
如果没有API方法来解决这个(或者)问题,那么你可能会做一些错误的事情,而不是阅读更多的文档。
(正如我所理解的,静态variables在android中是一种常见的错误方式,因为它可以工作,但肯定会有不能工作的情况[例如,在生产中,在百万设备上])。
在你的情况下,我build议思考为什么你需要知道另一个活动是否还活着?..你可以开始另一个活动的结果,以获得其function。 或者你可以派生类来获得它的function等等。
最好的祝福。

我用了一个检查, if (!a.isFinishing()) ,它似乎做我所需要的。 a是活动实例。 这是不正确的? 为什么没有人尝试这个?

如果您对活动的特定实例的生命周期状态感兴趣,则除了新的“活动”variables应该是实例variables而非静态variables之外,siliconeagle的解决scheme看起来是正确的。

使用有序的广播。 请参阅http://android-developers.blogspot.nl/2011/01/processing-ordered-broadcasts.html

在您的活动中,在onStart中注册一个接收器,取消在onStop注册。 现在当一个服务需要处理一些活动可能会做得更好的事情时,从服务发送一个有序的广播(在服务本身有一个默认的处理程序)。 您现在可以在活动中响应该活动。 该服务可以检查结果数据以查看是否处理了广播,如果不采取适当的行动。

使用下面的代码find一个简单的解决方法

 @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(); } } 

除了接受的答案之外 ,如果您有多个活动实例,则可以使用计数器:

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