我正在建立一个须要登陆的应用程序。 我建立了主要和登陆活动。 android
在主要活动onCreate
方法中我添加了如下条件: 数组
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ... loadSettings(); if(strSessionString == null) { login(); } ... }
登陆表单终止时执行的onActivityResult
方法以下所示: app
@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
。 ide
有没有人知道如何设置变量global以免在用户已经成功验证后出现登陆表单? spa
就像上面讨论的那样OS能够在没有任何通知的状况下杀死APPLICATION(没有onDestroy事件),因此没有办法保存这些全局变量。 code
SharedPreferences多是一个解决方案,除了你有COMPLEX STRUCTURED变量(在个人例子中,我有整数数组来存储用户已经处理过的ID)。 SharedPreferences的问题在于,每次须要值时都很难存储和检索这些结构。 视频
在个人状况下,我有一个后台服务,因此我能够将这些变量移动到那里,由于服务有onDestroy事件,我能够轻松保存这些值。 进程
您可使用Intents,Sqlite或共享首选项。 对于媒体存储,如文档,照片和视频,您能够改成建立新文件。 事件
我找不到如何指定应用程序标签,但通过大量的谷歌搜索后,从清单文件docs中能够看出:除了应用程序节中的默认图标和标签外,还使用了android:name。 文档
android:name为应用程序实现的Application子类的彻底限定名称。 启动应用程序进程时,将在任何应用程序的组件以前实例化此类。
子类是可选的; 大多数应用程序不须要一个。 在没有子类的状况下,Android使用基本Application类的实例。
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(); ... } }
在恢复以前调用活动结果。 所以,将登陆检查移至恢复状态,一旦secomd活动返回确定结果,您的第二次登陆就会被阻止。 每次都会调用简历,所以没必要担忧第一次没有调用它。