android开发分享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,它也可以用于活动。 看看这里;

    相应地更改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 ,或者在接受的答案中指出竞争条件或内存泄漏的问题。

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

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

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

    使用有序的广播。 请参阅

    在您的活动中,在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--; } } 

      以上就是android开发分享Android:如何检查活动是否正在运行?相关内容,想了解更多android开发(异常处理)及android游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/addevelopment/516674.html

      (0)
      上一篇 2020年12月3日
      下一篇 2020年12月3日

      精彩推荐