android - 无法使用空调用包调用 LoginActivity。如果调用者的 launchMode 为 singleInstance,则可能会发生这种情况

标签 android facebook authentication singleton

我创建了一个单例类来连接到 Facebook 并获取用户的凭据。这是:

public class FacebookHelper implements Session.StatusCallback {

private static final String TAG = FacebookHelper.class.getSimpleName();
private static final int REQUEST_CODE_FACEBOOK = 64206;
public static final String FACEBOOK_STRING = "Facebook";

private static FacebookHelper instance = null;
private static Activity activity;

private FacebookHelper(Context context) {
    CupsLog.d(TAG, "FacebookHelper");
    this.activity = (Activity) context;
}

public static FacebookHelper getInstance(Context context) {
    if (instance == null) {
        instance = new FacebookHelper(context);
    }
    return instance;
}

public void commitFacebookLogin() {
    CupsLog.d(TAG, "commitFacebookLogin");
    FileAccessUtil.getInstance(activity).setStringProperty(Consts.AUTH_TYPE, FacebookHelper.FACEBOOK_STRING);
    if (Session.getActiveSession() != null && Session.getActiveSession().isOpened()) {
        onSessionStateChanged(Session.getActiveSession(), Session.getActiveSession().getState(), null);
    } else {
        Session.openActiveSession(activity, true, this);
    }
}

@Override
public void call(Session session, SessionState state, Exception exception) {
    onSessionStateChanged(session, state, exception);
}

private void onSessionStateChanged(Session session, SessionState state, Exception exception) {
    CupsLog.d(TAG, "onSessionStateChanged, state: " + state.toString());
    if (state.isOpened()) {
        setFacebookTokenAndCookie();
        App.getEventBus().post("Facebook");
    }
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    CupsLog.d(TAG, "onActivityResult");
    switch (requestCode) {
        case REQUEST_CODE_FACEBOOK: {
            Session.getActiveSession().onActivityResult(activity, requestCode, resultCode, data);
            break;
        }
        default: {
            break;
        }
    }
}

private void setFacebookTokenAndCookie() {
    CupsLog.i(TAG, "setFacebookTokenAndCookie");
    String val = "fb+" + Session.getActiveSession().getAccessToken();
    CupsLog.i(TAG, "Facebook access_token: " + val);
    CookieUtil.getInstance(activity).setCookie(CookieUtil.AUTH_COOKIE_NAME, val, true);
    CupsTracker.instance.sendAnalyticsEvent(CupsTracker.LOGIN, CupsTracker.FACEBOOK_LOGIN, CupsTracker.FACEBOOK_LOGIN, null);
    CupsTracker.instance.sendAnalyticsView("fb login");
    CupsTracker.instance.trackMobileAppTrackerAction(CupsTracker.FACEBOOK_LOGIN);
    App.getInstance().setAuthSource(App.AuthSource.FACEBOOK);
    AccountService.getInstance(activity).pullAccountDetailsFromServer();
}

public void closeAndClearTokenInformation()
{
    CupsLog.d(TAG, "closeAndClearTokenInformation");
    Session session = Session.getActiveSession();
    if (session != null && !session.isClosed()) {
        session.closeAndClearTokenInformation();
    }
}
}

所以,基本上当我想连接到 Facebook 时,我会从我的 Activity 运行此方法。

FacebookHelper.getInstance(LoginActivity.this).commitFacebookLogin();

第一次运行效果很好,但问题是第二次我收到标题中指定的错误。现在我知道我的这个辅助类是单例的,但是我能做些什么来改变它呢?我有什么选择?

我认为我的查询不重复 for this question因为我遇到这个错误的情况与那里的情况完全不同。

最佳答案

要解决此问题,我必须更改单例 getter:

public static FacebookHelper getInstance(Context context) {
    if (instance == null) {
        instance = new FacebookHelper(context);
    }
    return instance;
}

对此:

  public static FacebookHelper getInstance(Context context) {
    if (instance == null) {
        instance = new FacebookHelper(context);
    }
    else
    {
        activity = (Activity) context;
    }
    return instance;
}

并使用 Activity 实例而不是简单的上下文。基本上,每次获取单例实例时,我都会为其分配一个新 Activity 。

关于android - 无法使用空调用包调用 LoginActivity。如果调用者的 launchMode 为 singleInstance,则可能会发生这种情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23640933/

相关文章:

Android - 打开小部件上下文菜单的 Intent

android - MPAndroidChart BarChart xValues 问题

android - 如何编写一个使用 Context 从 Android 框架中检索数据的用例

android - 如何为 MenuItem 设置标签?

c# - 使用 Flash 客户端和 .NET 服务器端的 Facebook 多人 Canvas 游戏

c# - 将 USER_ID_PROPERTY 添加到 Hashtable 时,MQQueueManager 构造函数失败

c# - 使用 URI 启动器恢复而不是重新启动应用程序

java - Facebook 登录 加载用户资料

asp.net-mvc-3 - 在 MVC 3 中持久化用户数据

c# - C#中的两种不同的窗体