最近,我在应用程序中发现了一个依赖于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
已恢复停止并由主屏幕活动代替。
所以我的问题是:即使屏幕被锁定或应用程序处于后台,如何正确重置活动回栈?