1

您好我目前正在使用适用于 Android 的 Facebook SDK 3.0。这里首先是一些事实。

  • 我没有将 app_id 放在 AndroidManifest.xml 中,而是以编程方式在我的 java 代码中设置了该值。因此,在处理会话时,我使用了类似以下辅助方法的方法。

    if (session == null || session.isClosed()) {
        String applicationId = Persistent.getString(null, SocialUtil.FACEBOOK_APP_ID);
        session = new Session.Builder(Utils.ctx).setApplicationId(applicationId).build();
        Session.setActiveSession(session);
    }
    
  • 一旦用户使用 facebook 登录,会话就会在许多活动中使用,这就是我为会话提供应用程序上下文的原因。

正如您在会话上下文中看到的,我提供了 Utils.ctx,它是一个应用程序对象。由于 Facebook SDK 的原生 UiLifecycleHelper 在会话不存在时使用 Activity 创建会话,因此我通过处理原始 UiLifeCycleHelper 并只是切换来创建自己的 FBIUiLifecycleHelper

    session = new Session(activity);

    String applicationId = Persistent.getString(null, SocialUtil.FACEBOOK_APP_ID);
    session = new Session.Builder(Utils.ctx).setApplicationId(applicationId).build();

.

但是,似乎每当我的活动中的会话状态发生变化时,根本不会调用回调函数。我认为这是因为我在处理会话时使用了应用程序上下文而不是活动上下文。

我的问题是,1. 当您为会话的上下文提供应用程序上下文或活动上下文时,它有什么不同?2. 什么时候推荐的做法是?为什么?3. 假设用户登录创建了一个带有活动上下文的会话。一旦这个会话被setActiveSession()设置为,这个会话可以通过调用getActiveSession()在其他活动中使用吗?也许我真的不必为会话上下文使用应用程序上下文?

谢谢!

4

1 回答 1

1

对于 1. 和 2.,您创建 Session 所使用的 Context 无关紧要,可以是任何 Context(应用程序、服务或活动)。但是当你调用任何 open* 方法时,你必须通过 OpenRequest 传入一个 Activity 或一个 Fragment。如果您的会话没有在状态之间转换,那么这就是一个问题(请在您实际打开会话时发布更多代码,并确保您在 Activity 或 Fragment 中覆盖 onActivityResult 方法)。

对于 3.,是的,您可以从任何地方(Activity、Fragment 或应用程序中的任何其他代码)调用 getActiveSession。

于 2013-02-25T23:07:30.560 回答