Facebook Android SDK-使用UiLifecycleHelper时,我应该使用活动还是应用程序作为上下文?

Facebook Android SDK-使用UiLifecycleHelper时,我应该使用活动还是应用程序作为上下文?,android,facebook,session,Android,Facebook,Session,您好,我目前正在使用Facebook SDK 3.0 for Android。 以下是一些事实 我没有将我的app_id放入AndroidManifest.xml中,而是以编程方式在java代码中设置该值。因此,在处理会话时,我使用类似于以下helper方法的方法 if (session == null || session.isClosed()) { String applicationId = Persistent.getString(null, SocialUtil.FACEBO

您好,我目前正在使用Facebook SDK 3.0 for Android。 以下是一些事实

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

    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,它是一个应用程序对象。 由于FacebookSDK的原生UiLifecycleHelper在会话不存在时创建带有活动的会话,因此我通过处理原始UiLifecycleHelper并切换创建了自己的FBIUiLifecycleHelper

    session = new Session(activity);

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

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);
}
我的问题是,, 1.当您为会话的上下文提供应用程序上下文或活动上下文时,会有什么不同? 2.什么时候推荐哪种做法?为什么? 3.假设一个用户登录创建了一个带有活动上下文的会话。将此会话设置为by setActiveSession()后,是否可以通过调用getActiveSession()在其他活动中使用此会话?也许我真的不必将应用程序上下文用于会话上下文


谢谢

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


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

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


对于3.,是的,您可以在任何地方调用getActiveSession(活动、片段或应用程序中的任何其他代码)。

谢谢您给我打电话。实际上,我遇到的问题是,我在活动a中使用了UILifecycleAlper。在a中,如果用户单击按钮,那么活动B将启动并开始会话打开,然后活动C将打开,请求用户提供一些发布权限。当C打开时,B调用finish(),C完成后,C也调用finish(),最终显示原始活动A。在这种情况下,奇怪的是,当A的onResume()被调用时,即使facebook会话发生了变化,UiLifecycleHelper的回调函数也没有被调用。你知道怎么回事吗?因为在登录后没有调用回调函数,现在我只是在的onPause()中检查会话状态,并在会话登录状态时执行一些操作。我想使用回调函数和UiLifecycleHelper,但由于它没有调用,我正在尝试找出问题所在。。。如果跨多个活动进行会话管理,UiLifecycleHelper中可能存在错误。您是否正在使用相同的活动会话(但只是请求新权限)?是的。每当我请求新权限时,我总是通过调用session.getActiveSession()来获取现有会话。如果您获得了可靠的复制案例,您可以在此处将其报告为错误,谢谢您的提醒。实际上,我遇到的问题是,我在活动a中使用了UILifecycleAlper。在a中,如果用户单击按钮,那么活动B将启动并开始会话打开,然后活动C将打开,请求用户提供一些发布权限。当C打开时,B调用finish(),C完成后,C也调用finish(),最终显示原始活动A。在这种情况下,奇怪的是,当A的onResume()被调用时,即使facebook会话发生了变化,UiLifecycleHelper的回调函数也没有被调用。你知道怎么回事吗?因为在登录后没有调用回调函数,现在我只是在的onPause()中检查会话状态,并在会话登录状态时执行一些操作。我想使用回调函数和UiLifecycleHelper,但由于它没有调用,我正在尝试找出问题所在。。。如果跨多个活动进行会话管理,UiLifecycleHelper中可能存在错误。您是否正在使用相同的活动会话(但只是请求新权限)?是的。每当我请求新权限时,我总是通过调用session.getActiveSession()来获取现有会话。如果您获得了可靠的复制案例,您可以在此处将其报告为错误