我有一个典型的 Android 应用程序,用户必须在显示应用程序的主要活动之前登录。但是,如果我们已经有一个缓存的用户名/密码,我想跳过登录页面。
我可以在我的 LoginonCreate
中检测我是否有用户/通行证并推送一个新的 Activity,但我担心这会使我的应用程序启动速度变慢(因为我必须加载一个 Activity 然后立即将其丢弃) ,并且它也可能会破坏后退按钮(即您可以回击并最终回到登录屏幕)。
有什么办法可以避免这种情况,并且只有在没有缓存密码的情况下才加载完整的登录活动?
我有一个典型的 Android 应用程序,用户必须在显示应用程序的主要活动之前登录。但是,如果我们已经有一个缓存的用户名/密码,我想跳过登录页面。
我可以在我的 LoginonCreate
中检测我是否有用户/通行证并推送一个新的 Activity,但我担心这会使我的应用程序启动速度变慢(因为我必须加载一个 Activity 然后立即将其丢弃) ,并且它也可能会破坏后退按钮(即您可以回击并最终回到登录屏幕)。
有什么办法可以避免这种情况,并且只有在没有缓存密码的情况下才加载完整的登录活动?
您可以创建一个单独的辅助活动来启动您的登录活动或您的主要活动。在它的onCreate
中,您将使用startActivity
并立即调用finish
以从后台堆栈中删除辅助活动。
Intent intent;
if ( /* already logged in */ ) {
intent = new Intent(this, MainActivity.class);
} else {
intent = new Intent(this, LoginActivity.class);
}
startActivity(intent);
finish();
然后,LoginActivity
应正常重新启动MainActivity
。这样,用户将永远无法导航回辅助活动,因为它不会出现在后台堆栈中。但是请注意,用户仍然可以登录、转到MainActivity
、暂停该活动、删除他的帐户(通过 Android 设置)并恢复活动(从最近的应用程序)。如果您想防止这种情况,您最好将登录重定向放置在其中MainActivity
(甚至可能在 中onResume
)。
您可以创建一个 Splash Activity。
在AndroidManifest.xml
的 Splash Activity 标签上,添加android:noHistory="true"
.
在 Splash Activity 上,检查您需要的任何内容(AsyncTask
可能需要很长时间,以避免冻结 Activity),然后根据结果启动 Login Activity 或任何其他 Activity。
另一种方法是将登录屏幕从 转换Activity
为Dialog
. 那应该很容易。然后让您的主要活动检查是否有缓存的用户名/密码。在第二种情况下显示LoginDialog
给用户。
我也有一个具有相同要求的典型Android应用程序,我解决它如下。
首先,我将初始启动活动配置为MainActivity
,然后在内部onCreate()
,检查用户是否保存了凭据(这一切都通过AccountManager
验证器服务完成)。
如果检查失败并且用户需要进行身份验证,那么我将启动LoginActivity
. 如果登录失败或用户回击,则MainActivity
调用finish()
自身以关闭整个应用程序。否则,登录后,将MainActivity
恢复并正确呈现给用户。
按此顺序执行此操作的优点是(在我的情况下)用户更有可能登录而不是退出,因此这将避免您所说的任何不需要的活动的开始/停止。
第二个优点是,如果MainActivity
(或其他活动)稍后恢复并且用户的会话已过期,您可以简单地LoginActivity
再次启动以重新验证它们。
希望一切都有意义:)