关闭。这个问题是opinion-based .它目前不接受答案。
想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.
4个月前关闭。
Improve this question
我一直在为我的应用程序结构苦苦挣扎。而且看起来这种结构真的让我在开发其他功能时遇到了很多痛苦。所以在继续之前,我想得到一些建议,看看我是否在这里做错了什么。
我的应用程序的目的是连接到服务器,我使用 AccountManager 机制在设备上创建一个帐户并存储一个应该用于从服务器请求数据的 token 。在创建帐户时,一切都很好。 (它也可以从设备设置 -> 添加一个帐户)
它是这样的:
MainActivity 是在您启动应用程序时检查您是否有帐户的 Activity 。
如果您有帐户,我会在静态变量中获取 token ,以便 MainActivity 中的每个 fragment 都可以访问它。 (应该工作,但没有)
否则,我使用 LoginActivity 创建一个 Intent 以在设备上创建一个帐户。
问题是我的 fragment 无法获取此 token ,因为当我使用 AccountManager.getAuthToken() 在线程中恢复 token 时, fragment 是在恢复此 token 之前创建的。因此我无法从我的服务器请求数据。
这让我觉得我的应用程序结构可能不是那么好。
所以我在想,“如果我喜欢这样呢?” :
这种方式让我认为 MainActivity 将有 token 通过,但我不确定它在 UX 方面是否理想。 (在访问内容之前必须等待 token )。
在这一点上,我对每一个建议都持开放态度,因为我真的被困住了。
谢谢 !
更新 1:
它更多的是登录/注册应用程序逻辑,而不是处理 AccountManager。我已经设法让它们工作了,但我真的在为“最佳实践”应用程序逻辑结构而苦苦挣扎,所以我不会因此而遇到许多其他问题(因为我真的没有时间)。
我所需要的只是一个图表或一些东西来向我展示一个“最佳实践”示例,以使我的应用程序按照我上面解释的方式工作。
我也遇到了一个问题,因为当我启动 MainActivity 时,它会检查一个帐户,如果没有,它会启动 LoginActivity,但如果我按下回,我可以看到 MainActivity(未填充)。
最佳答案
更多的一般做法是您正在使用的内容:
这种结构是完全可以接受的,并且是服务器相关应用程序的正常流程。我更喜欢日志记录只是一个选项的模型,其中包含一些不需要登录的内容。每当触发需要登录的操作时,都会向用户显示登录信息。但是,您的模型应该可以正常工作。
我看到你的问题是
I also ran into a problem because when I start the MainActivity it checks for an account and if not it launches LoginActivity but if I press back, i can see MainActivity (unfilled).
这个问题可以通过一个不可见的 Dispatch Activity 来解决,它根据当前用户的状态启动 MainActivity 或 LoginActivity。如图所示,只需
finish()
您做出决定后的调度 Activity 。您的 LoginActivity 负责重新启动 DispatchActivity,它将重新决定下一步。一般不要覆盖 LoginActivity 的 onBackPressed 来启动 Dispatch,只要登录成功就启动 Dispatch。然而,如果你决定在你的 Activity 中显示一些内容,即使用户没有登录,你可以使用
onActivityResult
在登录请求后刷新 MainActivity 的内容。 The problem is that my fragments can't get this token because, as i'm recovering the token in a thread using AccountManager.getAuthToken(), the fragments are created before this token is recovered.
这个问题很正常。如果您在处理登录请求时已经创建了 Activity/fragment ,则必须能够通知这些。基本上,如果您的 fragment 没有显示“未经身份验证”的内容,那么您不应该遇到这个问题,因为您甚至不应该在登录之前创建这些 fragment 。
然而,同样,如果您决定在您的 Activity/fragment 中显示一些内容,即使用户未登录,您也必须通知这些正在运行的组件有关状态更改的信息。一种方法是在您的 Activity 中实现 onResume 以检查用户是否已登录并进行适当的更改。另一种方法是使用本地广播来通知正在运行的 Activity/fragment 状态已更改:
BroadcastReceiver mReciever = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
//do whatever you want //check state
}
};
public void onCreate(Bundle state) {
//bla bla
//bla bla
LocalBroadcastManager.getInstance(mContext).registerReceiver(mReciever, new IntentFilter("your_package_name.LOGIN_STATE_CHANGED"));
}
每当状态改变时,发送一个广播:
Intent intent = new Intent("your_package_name.LOGIN_STATE_CHANGED");
LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
当然,这可能会因具体情况而异。例如,如果您检查 Touch App on Google Play ,您会注意到我创建了一个无论用户的登录状态如何都可见的调度屏幕,然后在用户进入需要登录的 Activity 时要求用户登录。在这种情况下,任何需要登录的 Activity 都应相应地实现其 onActivityResult 并在用户登录时更新用户界面,如果用户未登录则完成。另一方面,psst app on Google Play使用闪屏来根据用户的状态决定是进入登录屏幕还是主屏幕。
关于android - 用于登录/注册的 AccountManager 控制流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18203892/