Как объявить глобальные переменные в Android? - PullRequest
587 голосов
/ 02 апреля 2009

Я создаю приложение, которое требует входа в систему. Я создал основной и логин активности.

В основной вид деятельности 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.

Кто-нибудь знает, как установить глобальную переменную, чтобы избежать появления формы входа в систему после успешной аутентификации пользователя?

Ответы [ 17 ]

2 голосов
/ 22 июня 2015

DO N'T Используйте другой тег <application> в файле манифеста. Просто сделайте одно изменение в существующем теге <application>, добавьте эту строку android:name=".ApplicationName", где ApplicationName будет именем вашего подкласс (используется для хранения глобальных), который вы собираетесь создать.

итак, ваш тег 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"
        >
1 голос
/ 19 декабря 2015

Вы можете сделать это, используя два подхода:

  1. Использование класса приложения
  2. Использование общих настроек

  3. Использование класса приложения

Пример:

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.
}

Этот метод будет работать для временного хранения. Вы действительно не представляете, когда операционная система убьет приложение из-за нехватки памяти. Когда ваше приложение работает в фоновом режиме, а пользователь перемещается по другому приложению, для работы которого требуется больше памяти, ваше приложение будет убито, поскольку операционная система отдает приоритет приоритетным процессам, а не фону. Следовательно, ваш объект приложения будет нулевым, прежде чем пользователь выйдет из системы. Поэтому для этого я рекомендую использовать второй метод, указанный выше.

  1. Использование общих настроек.

    String MYPREF="com.your.application.session"
    
    SharedPreferences pref= context.getSharedPreferences(MyPREF,MODE_PRIVATE);
    
    //Insert key as below:
    
    Editot editor= pref.edit();
    
    editor.putString("key","value");
    
    editor.commit();
    
    //Get key as below.
    
    SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
    
    String key= getResources().getString("key");
    
1 голос
/ 16 июля 2013

вы можете использовать Intents, Sqlite или Shared Preferences. Когда дело доходит до хранилища мультимедиа, такого как документы, фотографии и видео, вы можете вместо этого создавать новые файлы.

0 голосов
/ 28 ноября 2015

Вы можете создать класс, который расширяет класс Application, а затем объявить вашу переменную как поле этого класса и предоставить для него метод получения.

public class MyApplication extends Application {
    private String str = "My String";

    synchronized public String getMyString {
        return str;
    }
}

А затем, чтобы получить доступ к этой переменной в своей деятельности, используйте это:

MyApplication application = (MyApplication) getApplication();
String myVar = application.getMyString();
0 голосов
/ 11 ноября 2014

Подклассы также использовались средой BARACUS. С моей точки зрения, подклассы Приложение предназначено для работы с жизненными циклами Android; это то, что делает любой контейнер приложений. Вместо того, чтобы иметь глобальные переменные, я регистрирую bean-компоненты в этом контексте, чтобы они вводились в любой класс, управляемый контекстом. Каждый внедренный экземпляр компонента на самом деле является синглтоном.

Подробнее см. В этом примере

Зачем ручная работа, если вы можете иметь гораздо больше?

0 голосов
/ 11 октября 2014

По результатам деятельности вызывается раньше при возобновлении. Поэтому перенесите проверку входа в систему на резюме, и ваш второй вход в систему может быть заблокирован, как только операция secomd вернула положительный результат. О резюме вызывается каждый раз, поэтому не стоит беспокоиться, что его не вызовут с первого раза.

0 голосов
/ 17 июля 2014
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();
    ...
    }
}
...