草庐IT

android - 用于登录/注册的 AccountManager 控制流程

coder 2023-12-13 原文

关闭。这个问题是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 就像一个 Bootstrap ,它检查帐户并在设备上有帐户时获取 token ,但不会像当前版本那样生成任何类型的 View 。
  • MainActivity 或者重定向到 LoginActivity 或 ContentActivity(我们这样称呼它,应该使用我的 token 在我的 ListViews 中填充数据的 Activity )

  • 这种方式让我认为 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/

    有关android - 用于登录/注册的 AccountManager 控制流程的更多相关文章

    1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

      大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

    2. Ruby Readline 在向上箭头上使控制台崩溃 - 2

      当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

    3. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

      我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

    4. ruby-on-rails - openshift 上的 rails 控制台 - 2

      我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

    5. Ruby Sinatra 配置用于生产和开发 - 2

      我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

    6. ruby - inverse_of 是否适用于 has_many? - 2

      当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

    7. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

      说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

    8. 阿里云国际版免费试用:如何注册以及注意事项 - 2

      作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。​关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐

    9. 安卓apk修改(Android反编译apk) - 2

      最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

    10. ruby-on-rails - 在 Rails 控制台中使用 asset_path - 2

      在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O

    随机推荐