如何在Android上处理多个社交媒体登录和会话流?

sur*_*190 13 android facebook android-fragments

我创建了一个具有碎片导航抽屉的Android应用程序.

然后我开始使用社交媒体集成,即Facebook,Twitter和Google Plus.我正在使用相应的官方SDK.

非社交媒体会话和获取数据的调用在以下活动中进行:

  • Mainactivity:如果任何会话丢失或被撤销,则需要重定向到LoginActivity.这是在活动生命周期方法期间完成的.

  • LoginActivity :授予权限的位置,并在成功后重定向到Main

  • NavigationDrawerFragment :导航抽屉,我用它来显示用户的个人资料图像,姓名和电子邮件地址.

在这3个类中,我调用相应的SDK方法并管理会话,因此存在大量代码重复.

此外,3 SDK还提供了明显不同的身份验证方式.

  • Facebook:使用在UiLifeCycleHelper活动的所有标准生命周期功能上实现的功能.
  • Google Plus:您必须GooglePlay在活动中实施商店回调并创建GoogleApiClient所有活动.
  • Twitter:没有"接管你的应用程序"的态度,并且使用与在Android上通常的REST API调用相同的方式进行改造:使用Retrofit.但是,您必须为每次登录授予权限.

因此,所有这些用于处理不同社交媒体登录的功能都包含在所有必需的活动中,使得应用程序代码非常庞大且难以管理.

您是否有任何关于如何将这些auth方法抽象为易于维护的解决方案的建议,这使得管理会话变得更容易?我最好根据使用的登录信息进行单独的活动吗?

dro*_*dpl 3

我已经做过好几次了,我可以推荐给您的最佳方法是:

  • 提取您要添加集成的哪一部分。它只是共享,你想让用户启动会话吗?你需要任何类型的 API 密钥吗?
  • 完成第一步后,您可以提取一些所有社交平台通用的抽象层方法(几乎总是有一个通用功能)。
  • 为每个平台生成一个工厂,例如FacebookFactory能够TwitterFactory为给定任务生成准备好的对象的平台。想象一下您想要登录,然后向具体工厂请求并公开LoginTask常见操作requestOAuthToken,例如getSession,等等。如果由于其他原因存在无法抽象的东西,您总是可以沮丧地知道它不会破坏您的应用程序。
  • 您可以使用 Facade 模式生成更舒适的第二个抽象层,该模式是通过Context对象构建的(像 facebook 这样的一些网络确实具有侵入性,需要了解很多事情),通过以下方式决定您想要使用哪个社交网络一个enum

这是一个关于代码外观的模拟示例:

SocialFacade facade = SocialFacade.getInstance();
SocialSession session = facade.getSession(Network.Twitter);
String token = session.requestToken(apiId);
facade.getShare(Network.Twitter).sharePost(apiId, message);
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用某种第三方库,但这是我在没有任何东西适合我的需求时使用的方法。