我正在创建一个需要登录的应用程序。 我创建了主要和登录活动。
在主要活动onCreate方法中我添加了以下条件:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
...
loadSettings();
if(strSessionString == null)
{
login();
}
...
}
登录表单终止时执行的onActivityResult方法如下所示:
@Override
public void onActivityResult(int requestCode,
int resultCode,
Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode)
{
case(SHOW_SUBACTICITY_LOGIN):
{
if(resultCode == Activity.RESULT_OK)
{
strSessionString = data.getStringExtra(Login.SESSIONSTRING);
connectionAvailable = true;
strUsername = data.getStringExtra(Login.USERNAME);
}
}
}
问题是登录表单有时会出现两次( login()方法被调用两次),当手机键盘滑动时,再次出现登录表单,我猜问题是变量strSessionString 。
有没有人知道如何设置变量global以避免在用户已经成功验证后出现登录表单?
#1楼
就像上面讨论的那样OS可以在没有任何通知的情况下杀死APPLICATION(没有onDestroy事件),所以没有办法保存这些全局变量。
SharedPreferences可能是一个解决方案,除了你有COMPLEX STRUCTURED变量(在我的例子中,我有整数数组来存储用户已经处理过的ID)。 SharedPreferences的问题在于,每次需要值时都很难存储和检索这些结构。
在我的情况下,我有一个后台服务,所以我可以将这些变量移动到那里,因为服务有onDestroy事件,我可以轻松保存这些值。
#2楼
您可以使用Intents,Sqlite或共享首选项。 对于媒体存储,如文档,照片和视频,您可以改为创建新文件。
#3楼
我找不到如何指定应用程序标签,但经过大量的谷歌搜索后,从清单文件docs中可以看出:除了应用程序节中的默认图标和标签外,还使用了android:name。
android:name为应用程序实现的Application子类的完全限定名称。 启动应用程序进程时,将在任何应用程序的组件之前实例化此类。
子类是可选的; 大多数应用程序不需要一个。 在没有子类的情况下,Android使用基本Application类的实例。
#4楼
class GlobaleVariableDemo extends Application {
private String myGlobalState;
public String getGlobalState(){
return myGlobalState;
}
public void setGlobalState(String s){
myGlobalState = s;
}
}
class Demo extends Activity {
@Override
public void onCreate(Bundle b){
...
GlobaleVariableDemo appState = ((GlobaleVariableDemo)getApplicationContext());
String state = appState.getGlobalState();
...
}
}
#5楼
在恢复之前调用活动结果。 因此,将登录检查移至恢复状态,一旦secomd活动返回肯定结果,您的第二次登录就会被阻止。 每次都会调用简历,因此不必担心第一次没有调用它。