android - 登录屏幕 Activity 中带有后退按钮的不良行为

标签 android facebook splash-screen facebook-android-sdk

所以我正在构建一个应用程序,它有一个带有 facebook 登录按钮的启动/登录屏幕。 用户登录后,返回一个带有信息的用户对象,我想向数据库中插入一些数据(代码中还没有,但没关系),然后打开 MainActivity Activity 。

发生的事情是,在首次启动时,一切正常: 如果用户已经登录(=有一个 Activity session ), MainActivity Activity 启动。 如果用户未登录,将显示登录按钮要求用户登录,并再次打开 MainActivity成功的 Activity 。

如果用户从 MainActivity 中点击后退按钮, 出现白屏,并保持这种状态。如果再次按下后退按钮,应用程序关闭,当应用程序恢复时(例如从“最近的应用程序”窗口),白屏会再显示 1-2 秒,然后继续到 MainActivity。 .

我认为它发生是因为它试图返回到 SplashActivity但自从我finish()它,它不能...虽然,我不太确定,因为我尝试使用 Intent.FLAG_ACTIVITY_CLEAR_TOP 清理后栈和 Intent.FLAG_ACTIVITY_NEW_TASK ...

什么会导致这种行为?我该如何解决?

额外信息:
- SplashActivity设置为使用 intent-filter 作为应用程序的启动器启动在应用程序的 list 中:<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
- 在 HTC Sensation XE/w Android 4.1 上测试

这是一些代码 ( SplashActivity ):

public class SplashActivity extends Activity {
    private UiLifecycleHelper uiHelper;
    private Session.StatusCallback callback =
        new Session.StatusCallback() {
            @Override
            public void call(Session session, SessionState state, Exception exception) {
                onSessionStateChange(session, state, exception);    
            }
      };
    private ArrayList<String> permissions;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);

        uiHelper = new UiLifecycleHelper(this, callback);
        uiHelper.onCreate(savedInstanceState);

        permissions = new ArrayList<String>();
        permissions.add("email");
        permissions.add("user_birthday");

        Session session = Session.getActiveSession();
        if(session != null && session.isOpened()) {
            if(!session.getPermissions().contains(permissions)) {
                session.requestNewReadPermissions(new Session.NewPermissionsRequest(SplashActivity.this, permissions));
            }
        } else {
            LoginButton authButton = (LoginButton) findViewById(R.id.login_button);
            authButton.setReadPermissions(permissions);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        uiHelper.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        uiHelper.onPause();
    }

    private void onSessionStateChange(Session session, SessionState state, Exception exception) {
        if(session != null && state.isOpened()) {
                Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
                    @Override
                    public void onCompleted(GraphUser user, Response response) {
                        if (user != null) {
                                                    //no code here yet
                        }
                    }
                });
                Intent intent = new Intent(SplashActivity.this, MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
                finish();
    }
}

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

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        uiHelper.onSaveInstanceState(outState);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        uiHelper.onDestroy();
    }

}

最佳答案

听起来您不希望堆栈上出现启动 Activity 。如果是这样,您可以执行类似这样的操作来启动您的主要 Activity 。

  Thread nohistory = new Thread () {
    public void run () {
        try {
            Intent i = new Intent(Splash.this, ActivitySplash.class);
            i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(i);
            finish();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
};
nohistory.start();

希望这对您有所帮助。

关于android - 登录屏幕 Activity 中带有后退按钮的不良行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18031454/

相关文章:

android - 如何使用 CameraX 拍摄多张图像?

Android:日历事件回调

ios - 如何通过 UIDocumentInteractionController 共享多个文件?

ios - "fb:explicitly_shared"和 "no_feed_story"参数有什么区别?

ios - 将 Facebook SDK 更新到 3.5 后无法打开事件 session

firebase - UI 卡在闪屏中

android - 如何在 Android 的 textinputLayout 中设置 * in hint

android - 避免内部 getter/setter

cordova - 在cordova-plugin-splashscreen中更改启动画面微调器的颜色

java - Java 中的启动窗口