2013-10-27 3 views
1

Так что в моем приложении я использую SharedPreferences для сохранения состояния фрагмента. Но я хотел бы удалить те записи внутри SharedPreferences, когда пользователь выходит за пределы приложения. Я попытался следующие:Удаление значений, когда пользователь закрывает приложение

В моем главном классе:

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    if(isFinishing() == true) 
    { 
     SM.removePreferences(); 
    } 
} 

где СМ представляет собой экземпляр вспомогательного класса я создал. removerPreferences делает следующее:

public void removePreferences(){ 
    editor.clear(); 
    editor.commit(); 
} 

Но я заметил, что это никогда не выполнялось. В журнале я видел, что приложение входит в оператор isFinishing() if, но метод никогда не выполняется. Я также попробовал onDestroy(), но метод так и не получил.

Может кто-нибудь помочь мне в этом?

+0

'приложение входит в инструкцию isFinishing() if, но метод никогда не реализуется'. Если код переходит в блок 'if', тогда метод ДОЛЖЕН выполняться. Что заставляет вас говорить, что это не так? BTW, logcat не является хорошим способом устранения таких проблем. Вместо этого вы должны использовать отладчик. Вот для чего это. Кроме того, общие настройки не являются хорошим способом сохранения состояния, которое вы удалите, когда приложение выйдет. – Simon

+0

Как вы предлагаете, чтобы я сделал это условие сохранения состояний ... потому что это было мое последнее прибежище @Simon –

+0

«Как вы предлагаете, чтобы я сделал это, чтобы сохранить состояние вещей» - так как неясно, что «состояния» есть или почему вы «спасаете» их, на что невозможно ответить. Однако я согласен с Саймоном: не помещайте файлы в файлы, которые вы не хотите иметь в файлах. – CommonsWare

ответ

1

использование OnStop переопределение сделать это

так:

@Override 
protected void onStop() { 
    // TODO Auto-generated method stub 
    super.onStop(); 
    if(isFinishing() == true) 
    { 
     SM.removePreferences(); 
    } 
} 
0

Я думаю, что то, что вы ищете может быть достигнуто с помощью onSaveInstanceState механизма.

Тем не менее, я попытаюсь ответить на ваш конкретный вопрос, предполагая, что, говоря, что «метод никогда не реализован», вы имеете в виду, что значение оператора if всегда ложно и что ваш метод не вызван.

isFinishing() возвращает true только после того, как вы позвонили finish() на номер Activity или если кто-то еще спросил, что он будет готов. Если вы просто нажмете кнопку «Домой», вы получите isFinishing() == false, таким образом, ваш метод не будет вызван. Поэтому убедитесь, что вы на самом деле заканчиваете Activity, а не просто приостанавливаете его.

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

0

Не сохраняйте состояние экземпляра фрагмента в SharedPreferences, но в комплекте, который предназначен для этого. Вы можете получить к нему доступ вот так:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if ((savedInstanceState != null) { 
     // get your values, for example: 
     mID = savedInstanceState.getInt("ID"); 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    // put your values, for example: 
    outState.putInt("ID", mID); 
} 

Таким образом, вам не нужно самостоятельно управлять своими значениями.

Если у вас есть пользовательские объекты, вы можете заставить их реализовать Parcelable.

В отличие от этого, SharedPreferences предназначены для сохранения значений, которые должны сохраняться даже после закрытия приложения, то есть предпочтений.

+0

Я заметил что-то об использовании этого метода, он не обязательно называется. –

+1

Тогда вы должны задать другой вопрос о своей конкретной проблеме. – Terry

0

Лучшее местоположение для этого - onDestroy() без оператора if.
однако, вы можете читать с Android документации о OnDestroy(), что:

Существуют ситуации, в которых система будет просто убить процесс хостинга своей деятельности без вызова этого метода (или любые другие) в нем, так что он должен не должны использоваться, чтобы делать вещи, которые должны оставаться вокруг после того, как процесс уходит.

Итак, на мой взгляд, если вы не хотите, чтобы данные оставались после окончания действия, вы должны использовать класс для его хранения.

Смежные вопросы