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

如何在Android上处理多个社交媒体登录和会话流?,android,facebook,android-fragments,Android,Facebook,Android Fragments,我创建了一个android应用程序,它有一个带有片段的导航抽屉 然后我开始了社交媒体整合,即Facebook、Twitter和Google Plus。我正在使用各自的官方SDK 在以下活动中进行非社交媒体会话和电话获取数据: Mainactivity:如果任何会话丢失或被撤销,它需要重定向到LoginActivity。这是在活动生命周期方法期间完成的 LoginActivity:授予权限并在成功后重定向到Main NavigationDrawerFragment:在导航抽屉中,我使用它来显示用

我创建了一个android应用程序,它有一个带有片段的导航抽屉

然后我开始了社交媒体整合,即Facebook、Twitter和Google Plus。我正在使用各自的官方SDK

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

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

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

  • NavigationDrawerFragment
    :在导航抽屉中,我使用它来显示用户的配置文件图像、名称和电子邮件地址

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

此外,3个SDK提供身份验证的方式也截然不同

  • Facebook:使用在活动的所有标准生命周期功能上实现的
  • Google Plus:您必须在活动中实现
    GooglePlay
    存储回调,并在所有活动上创建
    GoogleAppClient
  • Twitter:没有那么“接管你的应用”的态度,它采用了与安卓系统上常见的restapi调用相同的改进方式:with。但是,您必须为每个登录授予权限
因此,所有这些用于处理不同社交媒体登录的功能都包含在所有必需的活动中,使得应用程序代码非常庞大且难以管理

对于如何将这些auth方法抽象为易于维护的解决方案,从而使会话管理更容易,您有什么建议吗?
我最好根据使用的登录名进行单独的活动吗?

我和你在同一条船上


到目前为止,我已经找到了工作,但我仍在玩弄它。

我也面临着这种问题。让我告诉你我做了什么

  • 尝试从用户设备中查找facebook、google和Twitter应用程序
  • 如果您找到了,请登录,在会话中使用该应用程序发布。这太容易管理了。不需要存储会话和所有会话。只需转到应用程序并从应用程序中获取或发布所需数据
  • 如果您没有从设备中找到应用程序,则必须使用libr进行对话框登录。它们还能够存储社交媒体的会话数据。像facebook和twitter一样,lib有自己的功能来存储和终止会话

  • 这就是
    工厂模式
    起作用的外部问题

    你需要去做

  • 为登录创建一个抽象工厂
  • 为常用方法创建一个接口

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

    • 提取要添加的集成部分。它只是共享,您想让用户启动会话吗,您需要任何类型的API密钥吗
    • 完成第一步后,您可以提取所有社交平台通用的一些抽象层方法(几乎总是有一个通用函数)
    • 为能够为给定任务生成准备好的对象的每个平台(如
      FacebookFactory
      TwitterFactory
      )生成工厂。假设您想登录,然后向具体工厂请求
      LoginTask
      ,并公开常见操作,如
      requestOAuthToken
      getSession
      ,等等。如果由于其他原因,存在无法抽象的内容,您可以随时向下转换,知道它不会破坏您的应用程序
    • 您可以使用Facade模式生成第二个抽象层,让人感觉更舒适。Facade模式是通过
      上下文
      对象构建的(一些像facebook这样的网络确实具有入侵性,需要知道很多事情),它决定您想通过
      枚举
      使用哪一个社交网络
    下面是一个模拟示例,介绍了代码的外观:

    SocialFacade facade = SocialFacade.getInstance();
    SocialSession session = facade.getSession(Network.Twitter);
    String token = session.requestToken(apiId);
    facade.getShare(Network.Twitter).sharePost(apiId, message);
    
    当然,您可以使用某种第三方库,但这是我在没有适合我的需要时使用的方法