1

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

发生的情况是,在第一次启动时,一切正常: 如果用户已经登录(=存在活动会话),MainActivity启动活动。 如果用户未登录,则会显示一个登录按钮,要求用户登录,并MainActivity在成功时再次打开活动。

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

我认为它的发生是因为它试图回到它,SplashActivity但因为我finish()它,它不能......虽然,我不太确定,因为我尝试使用Intent.FLAG_ACTIVITY_CLEAR_TOPIntent.FLAG_ACTIVITY_NEW_TASK......

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

额外信息:
-SplashActivity设置为在应用intent-filter程序清单中使用的应用程序启动器启动:<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();
    }

}
4

2 回答 2

1

听起来您不希望堆栈上的启动活动。如果是这样,你可以做这样的事情来启动你的主要活动。

  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();

希望这可以帮助。

于 2013-08-03T12:00:45.690 回答
0

找到了解决方案!

显然是这一if行:
if(!session.getPermissions().contains(permissions))

它所做的是检查我的permissions ARRAY(作为对象)是否在当前会话的权限数组中,如果没有(基本上总是如此),则 fire session.requestNewReadPermissions(new Session.NewPermissionsRequest(SplashActivity.this, permissions));

我所做的只是将其更改为我的权限数组字符串之一:
if(!session.getPermissions().contains("email"))

现在它起作用了!没有白屏了。我不确定为什么它会导致这种行为......也许是因为活动无法finish()正常......不知道,但它有效。

我是如何发现的:
简单地塞进Log.i()里面if并注意到它总是会触发,即使它不应该触发。

于 2013-08-03T14:58:54.150 回答