如何在后台正确重置活动堆栈?

时间:2019-04-22 10:11:12

标签: android user-interface

最近,我在应用程序中发现了一个依赖于Android版本的问题。在Android 7.0上可以正常运行,但在Android 6.0上则无法运行(运行应用程序的平台数量非常有限)。

我的应用程序中有一些耗时的操作,这些操作是在后台在单独的线程中执行的。例如,登录和注销操作要花费大量时间,因为应首先同步应用程序数据。在此操作期间显示ProgressDialog,因此用户无法执行任何操作来修改数据,但仍可以锁定/解锁屏幕。

同步完成且成功登录/注销完成后,将重置活动后台堆栈。欢迎,注册(实际上是登录/注销)和主屏幕有不同的活动。这是重置后退堆栈的方法(在主线程中执行):

public void resetActivityBackStack() {
        final int flags = Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK;
        Intent[] intents;

        switch (state.getSessionState()) {
            case INITIAL:
                intents = new Intent[]{WelcomeActivity.getIntent(context)};
                break;
            case REGISTRATION:
            case INITIALIZATION:
                intents = new Intent[]{WelcomeActivity.getIntent(context), RegActivity.getIntent(context)};
                break;
            default:
                intents = getMainBackStack(context);
        }
        intents[0].setFlags(flags);
        context.startActivities(intents);
    }

由于启动模式标志是硬编码的,因此有点难看。我想最好将它们移动到清单文件中。

屏幕锁定时出现问题,此方法无效。因此,如果用户按下登录键(从而开始同步),则锁定屏幕的主要活动将永远不会开始。

在Android 6.0上,我在日志中观察到类似的内容:

2019-04-18 17:31:32,621 [pool-7-thread-1] DEBUG r.i.m.controller.AppController: Intent { act=ru.infotecs.mobileterm.SYNC_ACTION } is scheduled to Thu Apr 18 17:32:02 GMT+03:00 2019
2019-04-18 17:31:32,622 [pool-7-thread-1] DEBUG StateMachine: synchronization is scheduled
2019-04-18 17:31:32,622 [main] DEBUG StateMachine: resetting activity back stack
2019-04-18 17:31:32,623 [pool-7-thread-1] DEBUG SynchronizedState@212568118: handle
2019-04-18 17:31:32,630 [pool-7-thread-1] DEBUG r.i.m.controller.AppController: Intent { act=ru.infotecs.mobileterm.SYNC_ACTION } is scheduled to Thu Apr 18 17:32:02 GMT+03:00 2019
2019-04-18 17:31:32,630 [pool-7-thread-1] DEBUG StateMachine: synchronization is scheduled

在Android 7.0上,我观察到了这一点:

2019-04-19 15:37:40,882 [pool-7-thread-1] DEBUG r.i.m.controller.AppController: Intent { act=ru.infotecs.mobileterm.SYNC_ACTION } is scheduled to Fri Apr 19 15:38:00 GMT+03:00 2019
2019-04-19 15:37:40,883 [pool-7-thread-1] DEBUG StateMachine: synchronization is scheduled
2019-04-19 15:37:40,884 [main] DEBUG StateMachine: resetting activity back stack
2019-04-19 15:37:40,929 [main] DEBUG r.i.m.r.trip.TripRegFragment: onStart
2019-04-19 15:37:40,931 [main] INFO  r.i.m.registration.RegActivity: onStart
2019-04-19 15:37:40,933 [main] DEBUG r.i.m.registration.RegActivity: onResume
2019-04-19 15:37:40,935 [main] DEBUG r.i.m.registration.RegActivity: requesting state update
2019-04-19 15:37:40,936 [main] DEBUG r.i.m.r.trip.TripRegFragment: onResume
2019-04-19 15:37:40,937 [main] DEBUG r.i.m.r.trip.TripRegFragment: flushing event queue

如您所见,RegActivity已恢复停止并由主屏幕活动代替。

所以我的问题是:即使屏幕被锁定或应用程序处于后台,如何正确重置活动回栈?

0 个答案:

没有答案