Android 登录屏幕上“后退”按钮的不必要行为活动
所以我正在构建一个应用程序,它有一个带有facebook登录按钮的启动/登录屏幕。 在用户登录并返回一个带有info的用户对象后,我想将一些数据插入数据库(代码中还没有,但无所谓),然后打开Android 登录屏幕上“后退”按钮的不必要行为活动,android,facebook,splash-screen,facebook-android-sdk,Android,Facebook,Splash Screen,Facebook Android Sdk,所以我正在构建一个应用程序,它有一个带有facebook登录按钮的启动/登录屏幕。 在用户登录并返回一个带有info的用户对象后,我想将一些数据插入数据库(代码中还没有,但无所谓),然后打开MainActivityactivity Thread nohistory = new Thread () { public void run () { try { Intent i = new Intent(Splash.this, ActivitySpl
MainActivity
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();
第一次发射时,一切正常:
如果用户已登录(=存在活动会话),将启动main活动。
如果用户未登录,登录按钮显示要求用户登录,并在成功时再次打开main活动
如果用户从MainActivity
点击后退按钮,将显示一个白色屏幕,并保持这种状态。如果再次按下后退按钮,应用程序将关闭,当应用程序恢复时(例如,从“最近的应用程序”窗口),白色屏幕将再显示1-2秒,然后进入MainActivity
我认为它之所以发生是因为它试图返回到splash活动
,但由于我finish()
它无法。。。尽管如此,我不太确定,因为我尝试使用Intent.FLAG\u ACTIVITY\u CLEAR\u TOP
和Intent.FLAG\u ACTIVITY\u NEW\u TASK
清理后台
什么会导致这种行为?我如何修复它?
额外信息:
-SplashActivity
设置为使用应用程序清单中的意图过滤器作为应用程序的启动器启动:
-在HTC Sensation XE/w安卓4.1上测试
下面是一些代码(SplashActivity
):
公共类SplashActivity扩展活动{
私人UiLifecycleHelper uiHelper;
private Session.StatusCallback回调=
新建会话。StatusCallback(){
@凌驾
公共无效调用(会话、会话状态、异常){
onSessionStateChange(会话、状态、异常);
}
};
私有ArrayList权限;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
uiHelper=新UiLifecycleHelper(此为回调);
uiHelper.onCreate(savedInstanceState);
权限=新建ArrayList();
权限。添加(“电子邮件”);
权限。添加(“用户生日”);
Session=Session.getActiveSession();
if(session!=null&&session.isOpened()){
如果(!session.getPermissions()包含(权限)){
session.requestNewReadPermissions(newsession.NewPermissionsRequest(SplashActivity.this,permissions));
}
}否则{
LoginButton authButton=(LoginButton)findViewById(R.id.login_按钮);
authButton.setReadPermissions(权限);
}
}
@凌驾
受保护的void onResume(){
super.onResume();
uiHelper.onResume();
}
@凌驾
受保护的void onPause(){
super.onPause();
uiHelper.onPause();
}
private void OnSessionState更改(会话、会话状态、异常){
if(session!=null&&state.isOpened()){
Request.executeRequestAsync(会话,新请求.GraphUserCallback(){
@凌驾
未完成公共无效(GraphUser用户,响应){
如果(用户!=null){
//这里还没有代码
}
}
});
意向意向=新意向(SplashActivity.this、MainActivity.class);
intent.addFlags(intent.FLAG\u ACTIVITY\u CLEAR\u TOP);
intent.addFlags(intent.FLAG\u活动\u新任务);
星触觉(意向);
完成();
}
}
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
onActivityResult(请求代码、结果代码、数据);
}
@凌驾
SaveInstanceState上受保护的无效(束超出状态){
super.onSaveInstanceState(超出状态);
uiHelper.onSaveInstanceState(outState);
}
@凌驾
公共空间{
super.ondestory();
uiHelper.ondestory();
}
}
听起来您不想在堆栈上使用splash活动。如果是这样,你可以这样做来启动你的主要活动
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();
希望这能有所帮助。听起来您不想在堆栈上进行飞溅活动。如果是这样,你可以这样做来启动你的主要活动
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();
希望这有帮助。找到了解决方案强>
显然,这是if
行:
如果(!session.getPermissions().包含(权限))
它所做的是检查我的权限
数组(作为一个对象)是否在当前会话的权限数组中,如果没有(基本上总是这样),则会触发
session.requestNewReadPermissions(newsession.NewPermissionsRequest(SplashActivity.this,permissions))代码>
我所做的只是将其更改为我的权限数组字符串之一:
if(!session.getPermissions().包含(“电子邮件”)
现在它工作了!没有白色屏幕了。我不知道为什么会有这样的行为。。。可能是因为活动无法正确地finish()。。。不知道,但它有效
我是如何发现的:
只需将Log.i()
塞进if
的内部,并注意到它总是会触发,即使它不应该触发。找到了解决方案强>
显然,这是if
行:
if