112 Глава 6 •
Хранение локальных данных
//
Если деятельность перезапущена, продолжить игру в
следующий раз
getIntent().putExtra(KEY_DIFFICULTY, DIFFICULTY_CONTINUE);
}
На �то закончи� наш раз�овор о преду�тановках� Тепер� давайте по��отри� на
�охранение �о�тояния запу�енно�о �кзе�пляра и�ры�
6 .3 . Запоминание
текущей позиции курсора
Е�ли вы из�ените ориента�и� �крана в про�е��е выполнения Su��ku� то за�етите�
что она «забывает» пози�и� кур�ора� Это прои�ходит пото�у� что �ы и�пол�зу�
е� �об�твенное окно про��отра
PuzzleView
� Обычно окна в ������� запо�ина�т
�об�твенное �о�тояние авто�атиче�ки� но как тол�ко �ы �а�о�тоятел�но �оздае�
про�ра��ное окно� на� приходит�я позаботит��я об �то� �а�и��
В отличие от преду�тановленно�о �о�тояния �о�тояние запу�енной про�ра��ы
по�тоянно из�еняет�я� Оно находит�я в кла��е
Bundle
�тека приложений ��������
Со�тояние запу�енной про�ра��ы предназначено для �охранения небол�ших
пор�ий инфор�а�ии� таких как положение кур�ора�
Вот что �ы должны �делат�� чтобы вкл�чит� данну� функ�и� в нашу про�
�ра��у:
Sudokuv4/src/org/example/sudoku/PuzzleView.java
1 import android.os.Bundle;
- import android.os.Parcelable;
-
- public class PuzzleView extends View {
5 private static final String SELX = "selX" ;
- private static final String SELY = "selY" ;
- private static final String VIEW_STATE = "viewState" ;
- private static final int ID = 42;
-
10 public PuzzleView(Context context) {
- // ...
- setId(ID);
- }
-
15 @Override
- protected Parcelable onSaveInstanceState() {
- Parcelable p = super.onSaveInstanceState();
- Log.d(TAG, „onSaveInstanceState" );
- Bundle bundle = new Bundle();
20 bundle.putInt(SELX, selX);
- bundle.putInt(SELY, selY);
- bundle.putParcelable(VIEW_STATE, p);
-
return bundle;
- }
6 .4 . Доступ к
внешней файловой системе 113
25 @Override
- protected void onRestoreInstanceState(Parcelable state) {
- Log.d(TAG, „onRestoreInstanceState" );
- Bundle bundle = (Bundle) state;
- select(bundle.getInt(SELX), bundle.getInt(SELY));
30 super.onRestoreInstanceState(bundle.getParcelable(VIEW_STATE));
- }
- // ...
- }
В �троке 5 �ы определяе� кон�танты для кл�чей �охранения и во��тановления
пози�ии кур�ора� На� нужно �охранят� и координату
X� и координату
Y и вдобавок
л�бое �о�тояние� необходи�ое для базово�о кла��а
View
�
�ак ча�т� обработки
Activity .onSaveInstanceState()
������� �пу�кает�я по иерархии
окон про��отра и вызывает
View .onSaveInstanceState()
в каждо� из окон� �D которо�
�D которо�
которо�
�о он найдет� То же �а�ое прои�ходит для �етода
onRestoreInstanceState() .
Обычно
�тот идентификатор (�D) берет�я из XML� но по�ле то�о� как
PuzzleView
был �оздан
по�ред�тво� про�ра��но�о кода� �ы должны у�тановит� �D �а�о�тоятел�но� Мы
задае� произвол�ный но�ер в �троке 8 (подойдет л�бое положител�ное значение)
и зате� и�пол�зуе� �етод
setid()
в �троке 12� чтобы при�воит� е�о�
Метод
onSaveInstanceState()
определен в �троке 16� Мы вызывае� �уперкла���
чтобы получит� е�о �о�тояние� и зате� �охраняе� е�о и наше �о�тояния в
Bundle
�
Невоз�ожно�т� вызыват� �уперкла�� приводит к ошибке вре�ени выполнения�
Позже вызывает�я
onRestoreInstanceState()
(�трока 26) для извлечения �охра�
ненной на�и инфор�а�ии� Мы получае� �об�твенные координаты
X и
Y из
Bundle
и зате� вызывае� �уперкла��� чтобы позволит� получит� е�у в�е� что необходи�
�о� По�ле то�о как произведены �ти из�енения� пози�ия кур�ора запо�инает�я
PuzzleView
так же� как и для л�бо�о дру�о�о окна про��отра ��������
Тепер� давайте по��отри�� как хранит� данные в �тарых добрых файлах�
6 .4 . Доступ к
внешней файловой системе
В недрах ������� работает L��ux� по�то�у зде�� и�еет�я и реал�ная ��онтирован�
������� работает L��ux� по�то�у зде�� и�еет�я и реал�ная ��онтирован�
работает L��ux� по�то�у зде�� и�еет�я и реал�ная ��онтирован�
L��ux� по�то�у зде�� и�еет�я и реал�ная ��онтирован�
� по�то�у зде�� и�еет�я и реал�ная ��онтирован�
ная файловая �и�те�а � корневы� катало�о� и в�е� о�тал�ны�� Файлы хранят�я
в �нер�онезави�и�ой фл�ш�па�яти� в�троенной в у�трой�тво� по�то�у они не
теря�т�я� ко�да телефон выкл�ча�т�
Вы �ожете пол�зоват��я в про�ра��е в�е�и обычны�и подпро�ра��а�и
ввода�вывода Java из пакета
java .io
� � учето� то�о� что ваши про�е��ы и�е�т
о�рани ченные разрешения� которые не позволя�т и� вне�ти бе�порядок в данные
дру�их приложений� На �а�о� деле о�новное �е�то� куда они �о�ут получит�
до�туп� — �то приватная папка пакета� �озданная во вре�я у�тановки (
/data/data/
packagename
)�
В кла��е
Context
е�т� не�кол�ко в�по�о�ател�ных �етодов (и и�и же кла��
Activity
ра�ширяет кажду� из деятел�но�тей)� которые позволя�т читат� и запи�
114 Глава 6 • Хранение локальных данных
�ыват� данные в �ту папку� Вот некоторые из них� которые наверняка ва� понадо�
бят�я:
deleteFile()
Удаляет приватный файл� Возвра�ает t�ue при у�пешно� завершении
дей�твия� в противно� �лучае — false
fileList()
Возвра�ает �пи�ок файлов в приватной зоне приложения в �а��иве
St���g()
openFileInput()
Открывает приватный файл для чтения� возвра�ает java������le��put�
St�eam
openFileOutput()
Открывает приватный файл для запи�и� Возвра�ает java������leOut�
put St�eam
Однако так как �та внешняя па�ят� о�раниченна� я реко�енду� хранит� зде��
лиш� небол�шие объе�ы данных� напри�ер �е�абайт или� в крайне� �лучае� два�
и т�ател�но обрабатыват� ошибки ввода�вывода на тот �лучай� е�ли �вободное
про�тран�тво будет и�черпано�
� �ча�т��� внешняя па�ят� — �то не един�твенное хранили�е данных� � кото�
ры� вы �ожете работат��
Достарыңызбен бөлісу: