Facebook Android API 和 Twitter Webview 登录集成
Posted
技术标签:
【中文标题】Facebook Android API 和 Twitter Webview 登录集成【英文标题】:Facebook Android API and Twitter Webview Login integration 【发布时间】:2013-09-18 15:23:09 【问题描述】:我有一个 android 应用程序,需要用户使用 facebook 或 twitter 登录。我设法实现了这两种方法并取得了部分成功。 facebook 登录是使用 facebook 的 this 教程实现的。
至于 twitter 登录,我只是使用了一个按钮来启动执行 webview 登录的 TwitterLoginActivity,如果成功则启动 TwitterHomeActivity,它在碎片方面的实现与 facebook 登录非常相似。
这里是整个登录实现的细分
FacebookHomeActivity 有 3 个片段
FacebookSplashFragment(使用 fb 或 twitter 登录的选项) FacebookSelectionFragment(显示应用菜单) FacebookUserSettingsFragmen(注销用户)。TwitterHomeActivity 有 2 个片段
TwitterSelectionFragment(显示应用菜单) TwitterUserSettingsFragment(注销用户)TwitterLoginActivity(包含通过我的服务器执行身份验证的 webview,它将重定向到 twitter 页面进行登录)
如果您还没有看到,问题是,如果我从 twitter 帐户注销,我必须启动 FacebookHomeActivity 才能看到登录 facebook 或 twitter 的选项。
这样做是非常hacky而且很糟糕。所以我想如果我把它全部做成碎片,它可能会解决我的问题。
LoginActivity(所有事物登录的主机)包含:
LoginSelectionFragment(选择用 facebook 或 twitter 登录) TwitterLoginFragment(通过 webview 登录用户) FacebookSelectionFragment(授权用户并显示菜单) TwitterSelectionFragment(显示菜单) FacebookUserSettingFragment(注销 Facebook 用户) TwitterUserSettingFragment(退出 Twitter 用户)通过使用它来显示不同登录状态下的正确片段:
@Override
protected void onResumeFragments()
super.onResumeFragments();
Session session = Session.getActiveSession();
if (session != null && session.isOpened())
// if the session is already open,
// try to show the selection fragment
getSupportActionBar().show();
showFragment(FACEBOOKSELECTION, false);
else if (Globals.loggedIn() && Globals.isTwitterUser())
// otherwise present the splash screen
// and ask the person to login.
getSupportActionBar().show();
showFragment(TWITTERSELECTION, false);
else
// otherwise present the splash screen
// and ask the person to login.
Globals.logout();
getSupportActionBar().hide();
showFragment(LOGINSELECTION, false);
让所有登录逻辑都以片段的形式存在对我来说似乎很有意义,但它的行为方式并不像我想象的那样工作。相反,它基本上运行每个片段中 onStart() 中的所有内容,所以想象一下弹出很多progressDiaglogs,除此之外什么都没有发生。 backstack 也被弄乱了,导致一个片段从未显示出来。要么我执行这个错误,要么这是解决这个问题的完全错误的方法。
我的问题是:如果这不是解决问题的好方法,那么实现 Facebook 登录和 Twitter 登录的更好方法是什么。
如果上述内容确实有意义并且没有任何问题,那么您认为我做错了什么?
【问题讨论】:
【参考方案1】:在尝试新方法大约 5 天后,例如使用自己的片段集将 Facebook 登录身份验证与自己的 Activity 隔离,这些片段也未能按应有的方式运行,我阅读了Fragments Documentation,它给了我一个更好地理解片段如何实际工作以及如何工作。对于与我遇到类似问题的任何人,我强烈建议您先阅读文档。
我使用的 FragmentManager 或者更确切地说 SupportFragmentManager 与方法 beginTransaction() 一起公开了名为 replace() 的方法,它允许您将当前视图中的片段替换为要显示的片段。以下是我的使用方法:
public void replaceFragment(Fragment f, Boolean addToBackStack)
if (addToBackStack)
getSupportFragmentManager().beginTransaction()
.replace(android.R.id.content, f).addToBackStack(null).commit();
else
getSupportFragmentManager().beginTransaction()
.replace(android.R.id.content, f).commit();
addToBackStack 参数是由你决定用户是否可以 显示新片段后导航回该片段。
因此,我没有使用 Facebook Android API 示例中显示的 showFragment(),而是将所有 showFragment() 方法替换为 replaceFragment()。
两者之间的区别在于,当您使用 showFragment() 方法预加载主机活动中的所有片段(在我的情况下为 LoginActivity.java)时,会发生所有片段的 onCreate(), onStart() 和 onResume() 函数被调用。这种行为很糟糕,因为我的一些片段开始执行 onStart() 方法中的代码,导致所有 progressDialogs 在不应该显示时也显示出来。
通过使用上面显示的replaceFragment()方法,我可以只在需要显示它时实例化片段,让我可以正常使用生命周期方法(onCreate()、onStart()、onResume()等)。
用户登录成功后,我简单地向用户展示我的菜单,并通过以下方法清除后台堆栈:
public void clearBackStack()
FragmentManager manager = getSupportFragmentManager();
// Get the number of entries in the back stack
int backStackSize = manager.getBackStackEntryCount();
// Clear the back stack
for (int i = 0; i < backStackSize; i++)
manager.popBackStack();
清除后台堆栈的关键区域将在用户完成后 成功登录,以及当用户成功退出时。
有了这个,我能够更好地控制片段,因为它们在生命周期方面表现得像活动。
希望这对那里的人有所帮助。
【讨论】:
以上是关于Facebook Android API 和 Twitter Webview 登录集成的主要内容,如果未能解决你的问题,请参考以下文章
Facebook 在 web laravel 和 android 移动应用程序上登录
android 在 facebook 聊天中使用 smack api
Android - 基于 facebook 的 Firebase 登录并调用 Facebook Graph Api 问题