尝试在android上使用facebook登录sdk并组织代码

尝试在android上使用facebook登录sdk并组织代码,android,static,callback,facebook-login,facebook-android-sdk,Android,Static,Callback,Facebook Login,Facebook Android Sdk,我正在为一个更大的项目在spike上实现Facebook登录。作为组织代码的一种尝试(我的意思是用按钮尽可能保持活动的干净),我想我可能已经用一些主要的黑客破坏了实际的登录过程。但据我所知,它应该会起作用。想法是在登录后启动另一个活动。 以下是我的主要活动: public class MainActivity extends ActionBarActivity implements OnClickListener { @Override protected void onCr

我正在为一个更大的项目在spike上实现Facebook登录。作为组织代码的一种尝试(我的意思是用按钮尽可能保持活动的干净),我想我可能已经用一些主要的黑客破坏了实际的登录过程。但据我所知,它应该会起作用。想法是在登录后启动另一个活动。 以下是我的主要活动:

public class MainActivity extends ActionBarActivity implements OnClickListener {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        setContentView(R.layout.activity_main);

        Button facebookLoginButton = (Button) findViewById(R.id.btn_facebook_login);
        facebookLoginButton.setOnClickListener(this);
    }


    @Override
    public void onClick(View view) {

        switch (view.getId()) {
            case R.id.btn_facebook_login:

                FacebookHelper.sMainActivityContext = getApplicationContext();
                LoginManager.getInstance().registerCallback(FacebookHelper.sCallbackManager,
                        FacebookHelper.sFacebookCallback);

                LoginManager.getInstance().logInWithReadPermissions(this,
                        Arrays.asList(AppResources.sFacebookPermissions));

            break;
        }

    }
}
还有黑客本身,FacebookHelper:

public class FacebookHelper {

    public static final CallbackManager sCallbackManager = CallbackManager.Factory.create();

    public static Context sMainActivityContext;

    public static final FacebookCallback<LoginResult> sFacebookCallback =
            new FacebookCallback<LoginResult>() {

                @Override
                public void onSuccess(LoginResult loginResult) {
                    Intent intent = new Intent(sMainActivityContext, SecondActivity.class);
                    sMainActivityContext.startActivity(intent);
                }

                @Override
                public void onCancel() {

                }

                @Override
                public void onError(FacebookException e) {

                }
            };

}
公共类FacebookHelper{
public static final CallbackManager sCallbackManager=CallbackManager.Factory.create();
公共静态语境;
公共静态最终FacebookCallback sFacebookCallback=
新建FacebookCallback(){
@凌驾
成功时公共无效(LoginResult LoginResult){
意向意向=新意向(sMainActivityContext,SecondActivity.class);
SmaVityContext.startActivity(意向);
}
@凌驾
公开作废{
}
@凌驾
公共无效onError(FaceBook例外e){
}
};
}
但当我按下按钮时,Facebook的登录活动就会闪烁,我又回到MainActivity。为什么会发生这种情况?我需要做什么才能使用单独的代码实现facebook登录,而不是使用facebook上的登录按钮?

1)您应该在onCreate中注册回调,否则当您的活动由于方向或大小更改而被回收时,您的回调将不会添加回新活动中。 2) 您必须将结果传递回onActivityResult中的callbackManager。 3) 如果您保留对主活动的静态引用,那么如果主活动得到回收,您可能会有它的旧实例。您还应该在onCreate中新建回调管理器,并使其成为活动的类变量

大概是这样的:

public class MainActivity extends ActionBarActivity implements OnClickListener {

    private CallbackManager callbackManager;


    private final FacebookCallback<LoginResult> facebookCallback =
            new FacebookCallback<LoginResult>() {

                @Override
                public void onSuccess(LoginResult loginResult) {
                    Intent intent = new Intent(this, SecondActivity.class);
                    startActivity(intent);
                }

                @Override
                public void onCancel() {

                }

                @Override
                public void onError(FacebookException e) {

                }
            };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        callbackManager = CallbackManager.Factory.create();
        setContentView(R.layout.activity_main);

        Button facebookLoginButton = (Button) findViewById(R.id.btn_facebook_login);
        facebookLoginButton.setOnClickListener(this);
        loginManager.getInstance().registerCallback(callbackManager,
                        facebookCallback);
    }


    @Override
    public void onClick(View view) {

        switch (view.getId()) {
            case R.id.btn_facebook_login:
                LoginManager.getInstance().logInWithReadPermissions(this,
                        Arrays.asList(AppResources.sFacebookPermissions));

            break;
        }

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)   {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }

}
公共类MainActivity扩展了ActionBarActivity实现OnClickListener{
私人CallbackManager CallbackManager;
专用最终FacebookCallback FacebookCallback=
新建FacebookCallback(){
@凌驾
成功时公共无效(LoginResult LoginResult){
意向意向=新意向(此,SecondActivity.class);
星触觉(意向);
}
@凌驾
公开作废{
}
@凌驾
公共无效onError(FaceBook例外e){
}
};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
sdkinInitialize(getApplicationContext());
callbackManager=callbackManager.Factory.create();
setContentView(R.layout.activity_main);
按钮facebookLoginButton=(按钮)findViewById(R.id.btn\u facebook\u登录);
setOnClickListener(此);
loginManager.getInstance().registerCallback(callbackManager,
facebook(回调);
}
@凌驾
公共void onClick(视图){
开关(view.getId()){
案例R.id.btn\u facebook\u登录:
LoginManager.getInstance().logInWithReadPermissions(此,
asList(AppResources.sFacebookPermissions));
打破
}
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
callbackManager.onActivityResult(请求代码、结果代码、数据);
}
}

回答得很好,很有魅力,谢谢!很遗憾,我实际上无法分离代码,但我仍然更喜欢这种方式,而不是登录按钮。