如何在超时情况下控制activity流量在Android以内?
How to control activity flow within Android in timeout situation?
我有一个小型 android 应用程序,它包含 1 个主要 activity(已启动 activity,任何人都可以使用)和一些 另外 3 项活动 需要 登录 和密码。
我创建了一个应用程序 class,用于保存是否有人登录的信息。
此外,在进入activity 5 分钟后,用户将被注销并自动发送到主activity。为此,我在应用程序 class 中创建了一个线程,它会休眠 5 分钟,然后注销用户并启动主线程 activity.
这里是相关代码:
public void setLoggedOut() {
isLoggedIn = false;
if (mTimerThread != null) {
mTimerThread.interrupt();
}
Intent myIntent = new Intent(MyApplication.this.getBaseContext(), MainActivity.class);
myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(myIntent);
}
startActivity 以上在某些设备(平板电脑)上有效,在其他设备上我收到以下错误并且应用程序崩溃:
android.util.AndroidRuntimeException:从 Activity 上下文外部调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK 标志。这真的是你想要的吗?
当然我不想要新任务,只是完成所有其他活动并返回主要任务(FLAG_ACTIVITY_CLEAR_TOP 听起来是正确的)。 Whosebug 中已经有线程出现此错误,但没有任何帮助解决我的问题。
如前所述,在某些设备上(甚至在 Android 工作室中模拟)它可以正常工作,但在某些设备上却不能。可能是 API 级别的问题(API 25/Android 7.1.1 有效,API 22/Android 5.1 无效),但我不确定...
我可以(可能)在每个 activity 中单独实现超时机制,但在我看来这不是最好的解决方案,我讨厌在不需要时重复代码。
有什么想法吗? Alternative/better 个概念?
Any ideas? Alternative concepts?
保持当前 activity 上下文并从中开始新的 activity:
public class App extends Application {
....
private WeakReference<Activity> currentActivityRef = null;
@Override
public void onCreate() {
super.onCreate();
...
registerActivityLifecycleCallbacks(
new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity,
Bundle savedInstanceState) {
currentActivityRef = new WeakReference<>(activity);
}
@Override
public void onActivityStarted(Activity activity) {
currentActivityRef = new WeakReference<>(activity);
}
@Override
public void onActivityResumed(Activity activity) {
currentActivityRef = new WeakReference<>(activity);
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity,
Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}
);
}
...
public void setLoggedOut() {
isLoggedIn = false;
if (mTimerThread != null) {
mTimerThread.interrupt();
}
if (currentActivityRef != null) {
final Activity activity = currentActivityRef.get();
if (activity != null && !(activity instanceof MainActivity)) {
activity.startActivity(new Intent(activity, MainActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
}
}
}
}
我有一个小型 android 应用程序,它包含 1 个主要 activity(已启动 activity,任何人都可以使用)和一些 另外 3 项活动 需要 登录 和密码。
我创建了一个应用程序 class,用于保存是否有人登录的信息。
此外,在进入activity 5 分钟后,用户将被注销并自动发送到主activity。为此,我在应用程序 class 中创建了一个线程,它会休眠 5 分钟,然后注销用户并启动主线程 activity.
这里是相关代码:
public void setLoggedOut() {
isLoggedIn = false;
if (mTimerThread != null) {
mTimerThread.interrupt();
}
Intent myIntent = new Intent(MyApplication.this.getBaseContext(), MainActivity.class);
myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(myIntent);
}
startActivity 以上在某些设备(平板电脑)上有效,在其他设备上我收到以下错误并且应用程序崩溃:
android.util.AndroidRuntimeException:从 Activity 上下文外部调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK 标志。这真的是你想要的吗?
当然我不想要新任务,只是完成所有其他活动并返回主要任务(FLAG_ACTIVITY_CLEAR_TOP 听起来是正确的)。 Whosebug 中已经有线程出现此错误,但没有任何帮助解决我的问题。
如前所述,在某些设备上(甚至在 Android 工作室中模拟)它可以正常工作,但在某些设备上却不能。可能是 API 级别的问题(API 25/Android 7.1.1 有效,API 22/Android 5.1 无效),但我不确定...
我可以(可能)在每个 activity 中单独实现超时机制,但在我看来这不是最好的解决方案,我讨厌在不需要时重复代码。
有什么想法吗? Alternative/better 个概念?
Any ideas? Alternative concepts?
保持当前 activity 上下文并从中开始新的 activity:
public class App extends Application {
....
private WeakReference<Activity> currentActivityRef = null;
@Override
public void onCreate() {
super.onCreate();
...
registerActivityLifecycleCallbacks(
new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity,
Bundle savedInstanceState) {
currentActivityRef = new WeakReference<>(activity);
}
@Override
public void onActivityStarted(Activity activity) {
currentActivityRef = new WeakReference<>(activity);
}
@Override
public void onActivityResumed(Activity activity) {
currentActivityRef = new WeakReference<>(activity);
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity,
Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}
);
}
...
public void setLoggedOut() {
isLoggedIn = false;
if (mTimerThread != null) {
mTimerThread.interrupt();
}
if (currentActivityRef != null) {
final Activity activity = currentActivityRef.get();
if (activity != null && !(activity instanceof MainActivity)) {
activity.startActivity(new Intent(activity, MainActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
}
}
}
}