所以我正在构建一个应用程序,它有一个带有 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/