2011-06-15 53 views
2

我想知道什么是做到这一点的最好办法:我查询到需要记录用户的API检查用户登录和启动LoginActivity

。当应用程序开始进行登录时,如果它正确,将存储用户/传入首选项。

一旦我们记录了,如果在我试图从API调用方法的任何活动中发生NOT_LOGGED错误,我将从首选项中检索用户/密码并再次执行登录。 如果成功,我的程序将再次尝试API查询。如果不是,则会打开LoginActivity。这就是我不知道最好做什么的地方。

作为“Relogin”的使用方法,我已决定在MyApp中实现,这是一个从Application延伸并保持对象在Activityitiy的所有生命周期中一直存在的类。但是我无法从那里关闭一堆活动,对吗? 我的想法是关闭的活动当前堆栈并打开登录一个,使用此:

if(!mMyApp.relogin(mCtx)){ 
    Intent intent=new Intent(mCtx,ActivityLogin.class);  
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);      
    startActivity(intent); 
    finish(); 
} 

但我不得不打电话从适当的活动方法完成,但没有从MyApp的。 所以我必须重复所有我使用relogin(mCtx)方法的每个类中的所有代码。

您是否认为我以正确的方式解决问题,还是应该改变策略?顺便说一下,您认为最好的地方是实施将从不同活动中调用的方法。到目前为止,我一直在使用单身人士,但如果gc清理内存,我可能会失去这些信息。

谢谢, David。

回答

2

如果您让relogin接受Activity实例(而不是通用上下文),则可以在其中调用finish方法。尝试一下,看看:它应该工作。

而在任何情况下,当你使用Intent.FLAG_ACTIVITY_CLEAR_TOP它会自动销毁所有活动,所以finish可能是多余的。

+0

你对通用上下文有什么意思? mCtx是Activity的成员,因此如果我没有错,就是一个活动实例。 – Dayerman 2011-06-15 15:28:04

+0

啊,我假设relogin签名是'relogin(Context mCtx);',不是'relogin(Activity mCtx);'。如果你想调用'finish',它必须是第二个,因为'finish'是一个特定于Activity的方法,并且在Context中不可用。 – Femi 2011-06-15 15:39:32

+0

从外部使用FLAG_ACTIVTY_CLEAR_TOP调用它不起作用的活动。一个错误产生至极说::导致:android.util.AndroidRuntimeException:从活动上下文外调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是你想要的吗? – Dayerman 2011-06-15 16:16:24