我正在创建一个需要登录的应用程序。我创建了主活动和登录活动。

在主活动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。

有人知道如何设置变量全局,以避免登录表单出现后,用户已经成功验证?


当前回答

你可以使用两种方法来做到这一点:

使用应用程序类 使用共享首选项 使用应用程序类

例子:

class SessionManager extends Application{

  String sessionKey;

  setSessionKey(String key){
    this.sessionKey=key;
  }

  String getSessisonKey(){
    return this.sessionKey;
  }
}

你可以使用上面的类在MainActivity中实现登录。代码看起来像这样:

@override 
public void onCreate (Bundle savedInstanceState){
  // you will this key when first time login is successful.
  SessionManager session= (SessionManager)getApplicationContext();
  String key=getSessisonKey.getKey();
  //Use this key to identify whether session is alive or not.
}

This method will work for temporary storage. You really do not any idea when operating system is gonna kill the application, because of low memory. When your application is in background and user is navigating through other application which demands more memory to run, then your application will be killed since operating system given more priority to foreground processes than background. Hence your application object will be null before user logs out. Hence for this I recommend to use second method Specified above.

使用共享首选项。 字符串MYPREF = " com.your.application.session " SharedPreferences pref= context.getSharedPreferences(MyPREF,MODE_PRIVATE); //插入键如下: 编辑器编辑= pre .edit(); editor.putString(“关键”、“价值”); editor.commit (); //获取密钥如下所示。 sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); String key= getResources().getString("key");

其他回答

您可以使用一个静态字段来存储这种状态。或者把它放到资源Bundle中,然后在onCreate(Bundle savedInstanceState)上从那里恢复。只要确保你完全理解Android应用程序管理的生命周期(例如,为什么login()会在键盘方向改变时被调用)。

如果一些变量存储在sqlite中,你必须在应用程序的大多数活动中使用它们。 那么应用可能是实现它的最好方式。 当应用程序启动时,查询数据库中的变量,并将它们存储在一个字段中。 然后可以在活动中使用这些变量。

所以要找到正确的方法,没有最好的方法。

你可以使用两种方法来做到这一点:

使用应用程序类 使用共享首选项 使用应用程序类

例子:

class SessionManager extends Application{

  String sessionKey;

  setSessionKey(String key){
    this.sessionKey=key;
  }

  String getSessisonKey(){
    return this.sessionKey;
  }
}

你可以使用上面的类在MainActivity中实现登录。代码看起来像这样:

@override 
public void onCreate (Bundle savedInstanceState){
  // you will this key when first time login is successful.
  SessionManager session= (SessionManager)getApplicationContext();
  String key=getSessisonKey.getKey();
  //Use this key to identify whether session is alive or not.
}

This method will work for temporary storage. You really do not any idea when operating system is gonna kill the application, because of low memory. When your application is in background and user is navigating through other application which demands more memory to run, then your application will be killed since operating system given more priority to foreground processes than background. Hence your application object will be null before user logs out. Hence for this I recommend to use second method Specified above.

使用共享首选项。 字符串MYPREF = " com.your.application.session " SharedPreferences pref= context.getSharedPreferences(MyPREF,MODE_PRIVATE); //插入键如下: 编辑器编辑= pre .edit(); editor.putString(“关键”、“价值”); editor.commit (); //获取密钥如下所示。 sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); String key= getResources().getString("key");

在活动结果之前在简历上被调用。所以移动你的登录检查到恢复和你的第二次登录可以被阻止,一旦第二个活动已经返回积极的结果。On简历每次都会被调用,所以不用担心第一次没有被调用。

不要在manifest文件中使用另一个<application>标签。只需要在现有的<application>标签中做一个改变,添加这一行android:name="。ApplicationName”,其中,ApplicationName将是您即将创建的子类的名称(用于存储全局)。

所以,最后你的manifest文件中的ONE AND ONLY <application>标签应该是这样的:-

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.AppCompat.NoActionBar"
        android:name=".ApplicationName"
        >