您好我目前正在使用适用于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创建了sesssion,我通过处理原始的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()将此会话用于其他活动?也许我真的不必将应用程序上下文用于会话上下文?
谢谢!
答案 0 :(得分:1)
对于1.和2.,您创建会话的上下文无关紧要,可以是任何上下文(应用程序,服务或活动)。但是当你调用任何open *方法时,你必须通过OpenRequest传入一个Activity或Fragment。如果你的会话没有在状态之间转换,那么那里就是一个问题(请在实际打开会话时发布更多代码,并确保在你的Activity或Fragment中覆盖onActivityResult方法)。
对于3.,是的,您可以从任何地方调用getActiveSession(活动,片段或应用中的任何其他代码)。