Você está na página 1de 41

ProgramaoparaaPlataformaAndroidAula10

ArmazenamentoPersistentede
Dados
Comoarmazenarasopesdeprefernciadeumaaplicao?
Comotocarmsicasemumaa@vidadeAndroid?
ComoarmazenardadosusandoBundles?
Comousarosistemadearquivosdoaparelhocelular?
ComomanipulararquivosdetextoemJava?
Comoarmazenarobjetosdiretamenteemarquivos?

ArmazenamentoPermante
Dadosarmazenadospermanentementeno
desaparecemquandoaaplicaoterminasua
execuo.
Em que situaes
precisamos de
armazenamento
persistente?
Pense em
aplicaes
Android que
usam
persistncia.

ArmazenamentoPermante
Dadosarmazenadospermanentementeno
desaparecemquandoaaplicaoterminasua
execuo.
Guardaralistadecompras;
Armazenaralistadeendereos;
Lembraraposiodaspeasdexadrezno
tabuleiro;
Armazenarasopesescolhidasparauma
aplicao;
etc

MuitasformasdeArmazenamento
AAPIdepreferncias
EstadosdeBundles
Arquivosdearmazenamentoemmemria
esh
Etc

Preferncias
NossoSudokupossuiummenudeopes.
Voclembracomoissofoiimplementado?

Sudoku.java

Preferncias

publicbooleanonOp@onsItemSelected(MenuItemitem){
Modifique a
switch(item.getItemId()){
classe Prefs para
caseR.id.se^ngs:
startAc@vity(newIntent(this,Prefs.class)); que ela armazene
e retorne as
returntrue;
preferncias
}
escolhidas pelo
returnfalse;
usurio.
}
publicclassPrefsextendsPreferenceAc@vity{
@Override
se
O que es protectedvoidonCreate(BundlesavedInstanceState){
est super.onCreate(savedInstanceState);
o
d
o
t

m
?
fazendo
addPreferencesFromResource(R.layout.se^ngs);
}
}
Prefs.java

se^ngs.java

Preferncias

<?xmlversion="1.0"encoding="uf8"?>
<PreferenceScreen
xmlns:android="hjp://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:key="music"
android:@tle="@string/music_@tle"
android:summary="@string/music_summary"
android:defaultValue="true"/>
<CheckBoxPreference
android:key="hints"
android:@tle="@string/hints_@tle"
android:summary="@string/hints_summary"
android:defaultValue="true"/>
</PreferenceScreen>
publicclassPrefsextendsPreferenceAc@vity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.layout.se^ngs);
}
}
Prefs.java

ArmazenamentodePreferncias
ea
s

d
publicclassPrefsextendsPreferenceAc@vity{
o
Com
o
a
c
i
n
privatesta@cnalStringOPT_MUSIC="music";
u
m
co
privatesta@cnalbooleanOPT_MUSIC_DEF=true; entre o que
esse
n

a
r
privatesta@cnalStringOPT_HINTS="hints";
t
n
e
se
o
d
a
d
e
privatesta@cnalbooleanOPT_HINTS_DEF=true;
banco d

?
e
l
e
d

i
a
...
o que s
publicsta@cbooleangetMusic(Contextcontext){
returnPreferenceManager.getDefaultSharedPreferences
(context).getBoolean(OPT_MUSIC,OPT_MUSIC_DEF); Como aplicar
essas
}
prefern
publicsta@cbooleangetHints(Contextcontext){
cias?
returnPreferenceManager.getDefaultSharedPreferences
(context).getBoolean(OPT_HINTS,OPT_HINTS_DEF);
}
}
Prefs.java

Music.java

Tocarounotocarumamsica?
publicsta@cvoidplay(Contextcontext,intresource){
stop(context);
A class Prefs
mp=MediaPlayer.create(context,resource);
comporta-se
mp.setLooping(true);
como um
mp.start();
singleton.
}
publicsta@cvoidplay(Contextcontext,intresource){
stop(context);
if(Prefs.getMusic(context)){
mp=MediaPlayer.create(context,resource);
mp.setLooping(true);
ar
t
i
l
i
b
a
h
o
m
o
c
E
mp.start();
desabilitar as
u
o
}
dicas?
}

PuzzleView.java

Removendoasdicas

if(Prefs.getHints(getContext())){
Painthint=newPaint();
intc[]={getResources().getColor(R.color.puzzle_hint_0),
getResources().getColor(R.color.puzzle_hint_1),
getResources().getColor(R.color.puzzle_hint_2),};
Rectr=newRect();
for(inti=0;i<9;i++){
for(intj=0;j<9;j++){
intmoveslew=9game.getUsedTiles(i,j).length;
if(moveslew<c.length){
getRect(i,j,r);
hint.setColor(c[moveslew]);
canvas.drawRect(r,hint);
}
}
}
}

Con@nuandoumJogo
A opo continue
Modifique a nossa
implementao de
Sudoku para que seja
possvel interromper e
continuar um jogo
interrompido.
Seria possvel
usar a API de

preferncias?

No fund
o, tratase de um
a
tabela h
as
persiste h
nte!

Game.java

Comoumjogonovoob@do
privateint[]getPuzzle(intdi){
Stringpuz;
switch(di){
caseDIFFICULTY_HARD:
puz=hardPuzzle;
break;
caseDIFFICULTY_MEDIUM:
puz=mediumPuzzle;
break;
caseDIFFICULTY_EASY:
default:
puz=easyPuzzle;
break;
}
returnfromPuzzleString(puz);
}

Podemos adicionar uma


nova opo, para que
seja possvel
escolhermos o puzzle a
partir da tabela de
preferncias!

Como faz
er
isso?

privateint[]getPuzzle(intdi){
Que
Stringpuz;
ante
t
s
n
o
c
switch(di){
essa?
caseDIFFICULTY_CONTINUE:
puz=getPreferences(MODE_PRIVATE).getString(PREF_PUZZLE,
easyPuzzle);
Game.java
E como
break;
colocar
o estad
o do
caseDIFFICULTY_HARD:
tabulei
puz=hardPuzzle;
ro
tabela d na
break;
e
prefer
caseDIFFICULTY_MEDIUM:
ncias?
puz=mediumPuzzle;
Procure pensar
break;
nos eventos
caseDIFFICULTY_EASY:
necessrios
default:
para essa tarefa
puz=easyPuzzle;
Quando o
break;
puzzle dev
}
e
ser salvo?
returnfromPuzzleString(puz);

}

onPause
Game.java

publicclassGameextendsAc@vity{
privatesta@cnalStringPREF_PUZZLE="puzzle";

@Override
Vocs
protectedvoidonPause(){
m-se
a
r
b
m
le
super.onPause();
sa
s
e
d
Log.d(TAG,"onPause");

uno?
f
Music.stop(this);
getPreferences(MODE_PRIVATE).edit().putString(PREF_PUZZLE,
toPuzzleString(puzzle)).commit();
}

Game.java

toPuzzleString

sta@cprivateStringtoPuzzleString(int[]puz){
StringBuilderbuf=newStringBuilder();
for(intelement:puz){
buf.append(element);
}
E como podemos
comear um jogo
returnbuf.toString();
que havia sido
}
interrompido?

Em outras
palavras, co
mo
tratar o bot
o
continue?

Onde est o cdigo


que lida com
eventos de clique
dessa atividade?

EventosdeClique
Sudoku.java

publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.about_bujon:
Intenti=newIntent(this,About.class);
startAc@vity(i);
break;
caseR.id.new_bujon:
openNewGameDialog();
break;
caseR.id.exit_bujon:
nish();
break;
}
}

E como alter
ar
essa classe p
ara
que o boto
continue pos
sa
funcionar?

EventosdeClique
Sudoku.java

publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.conRnue_buSon:
startGame(Game.DIFFICULTY_CONTINUE);
break;
caseR.id.about_bujon:
Intenti=newIntent(this,About.class);
startAc@vity(i);
break;
caseR.id.new_bujon:
openNewGameDialog();
break;
caseR.id.exit_bujon:
nish();
break;
}
}

Ei, mas est


ciar
o
s
s
a
o
d
n
a
t
l
fa
o evento ao
boto!

BoteseEventos
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewaboutBujon=ndViewById(R.id.about_bujon);
aboutBujon.setOnClickListener(this);
ViewnewBujon=ndViewById(R.id.new_bujon);
newBujon.setOnClickListener(this);
ViewexitBujon=ndViewById(R.id.exit_bujon);
exitBujon.setOnClickListener(this);
ViewconRnueBuSon=ndViewById(R.id.conRnue_buSon);
conRnueBuSon.setOnClickListener(this);
}

OrientaodaTela
Sevirarmosatelaemmodopaisagem,nossa
aplicaoperdeainformaosobreonde
estavaocursor:
Com

o
resolver
esse
problema?

EstadodaViso
Todavisopossuiumestado:posiodo
cursor,nmeros,etc.
Quandotrocamosaviso,omtodoonDraw
davisoinvocado.
Por que a po
sio
dos nmeros

salva entre m
odo
retrato e pai
sagem?

os
m
e
d
o
p
o
m
E co
ar a
v
l
a
s
a
r
o
g
a
r?
o
s
r
u
c
o
d
posio

Bundles
Bundlessotabelasusadasparapassar
dadosentreA@vidades.
Podemsera@vidadesdiferentes
Ouamesmaa@vidade,nopassadoenofuturo.
Nessecaso,todaa@vidadeusadoismtodos:
protected Parcelable
onSaveInstanceState()
protected void onRestoreInstanceState
(Parcelable state)

SalvandoEstados
PuzzleView.java

@Override
protectedParcelableonSaveInstanceState(){
Parcelablep=super.onSaveInstanceState();
Bundlebundle=newBundle();
m
v
n
o
bundle.putInt(SELX,selX);
c
:
o
r
a
l
c
er as
c
e
u
q
bundle.putInt(SELY,selY);
s
e
o

n
s
bundle.putParcelable(VIEW_STATE,p);
constante
returnbundle;
E como se
}
ria
o
mtodo q
ue
restaura
o estado
da ativida
de?

RestaurandoEstados
PuzzleView.java

@Override
protectedvoidonRestoreInstanceState(Parcelablestate){
Log.d(TAG,"onRestoreInstanceState");
Bundlebundle=(Bundle)state;
select(bundle.getInt(SELX),bundle.getInt(SELY));
super.onRestoreInstanceState(bundle.getParcelable(VIEW_STATE));
return;
}
Como foi amar
gora,
a
,
a
t
l
a
F
r
ada
essa ligao en
tre o
estado salvo e
o
estado restaur
ado?

um
encontrar
ra
a
p
r
o
d
a
c
fi
identi
a viso.

Iden@cadores
publicclassPuzzleViewextendsView{
o
privatestaRcnalintID=42;
E porque n
o
...
colocamos
de
r
o
d
a
c
fi
i
t
n
publicPuzzleView(Contextcontext){ ide
um
m
e
w
e
i
V
e
l
Puzz
super(context);
o XML?
v
i
u
q
r
a
this.game=(Game)context;
setFocusable(true);
setId(ID);
setFocusableInTouchMode(true);
}
...
}

PreservandooEstadodaA@vidade
Notemqueapenasaposio
docursorestsendosalva.Os
nmerosnotabuleirono
estosendosalvos.

essa
r
a
t
r
e
s
n
o
C
omo
c
a
c
fi
a
n
u
lac
o.
i
c

c
r
e
x
e
um
Masissonofcil:
avisonomanipula
puzzles!

OSistemadeArquivos
AndroidOSLinux.
Eportanto,possuiumsistemadearquivos.

Arquivospodemsermanipuladospelasclasses
nabibliotecajava.io.
Cadaaplicaopossuiseuprprioespao.
Normalmentedata/data/nome_pacote

EaclasseContextpossuimtodospara
manipularosarquivosarmazenadosnesse
espao.

ManipulaodeArquivos
AclasseContextpossuidiversosmtodos
paramanipulararquivos:
deleteFile:apagaumarquivoeretorna
verdadeirocasoadeleotenhaacontecido.
fileList:retornaumarranjodestringscomo
nomedosarquivosnoespaodaaplicao.
openFileInput:abreumarquivoparaleitura.
openFileOutput:abreumarquivopara
escrita.

ArquivosdeTexto
Podemosarmazenarqualquer@podearquivo
comorecursoscrus,emres/raw/

Exibio de texto
Implemente uma classe
que abra, leia e exiba o
contedo de um arquivo
de texto armazenado em
res/raw/file1.txt

o
Como fazer iss
o
em Java, vers
desktop?

Como de
ve
ser o lay ria
out
dessa
aplica
o?

E haveria
alguma
diferena em
Android?

ScrollLayout

Como le
ro
conted
o do
arquivo
?

<?xmlversion="1.0"encoding="u58"?>
<LinearLayoutxmlns:android="h9p://schemas.android.com/apk/res/android"
android:orienta@on="verBcal"
android:layout_width="ll_parent"
android:layout_height="ll_parent"
>
<ScrollView
xmlns:android=
"h9p://schemas.android.com/apk/res/android"
android:layout_width="ll_parent"
android:layout_height="ll_parent"
android:padding="10dip">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</ScrollView>
</LinearLayout>

AulaAc@vity10.java

LendoumArquivo

privateStringreadText(){
InputStreaminputStream=getResources().openRawResource(R.raw.le1);
ByteArrayOutputStreambyteArrayOutputStream=
newByteArrayOutputStream();
Algum
inti;
problema com
try{
esse mtodo?
i=inputStream.read();
while(i!=1){
byteArrayOutputStream.write(i);
i=inputStream.read();
}
inputStream.close();
}catch(IOExcep@one){
e.printStackTrace();
}
returnbyteArrayOutputStream.toString();
}

AulaAc@vity10.java

Buerizao

privateStringgetTextFromFile(){
StringBuercontents=newStringBuer();
try{
InputStreamrawRes=getResources().openRawResource(R.raw.le1);
BueredReaderinput=
newBueredReader(newInputStreamReader(rawRes));
Stringline=null;
dem
Arquivos po
while((line=input.readLine())!=null){
ser lidos ou
contents.append(line+'\n');
escritos de
}
as
vrias form
}catch(IOExcep@onex){
diferentes.
ex.printStackTrace();
Como u
sar
}
esse
returncontents.toString();
mtod
o?
}

Decoradores
privateStringgetTextFromFile(){
StringBuercontents=newStringBuer();
try{
InputStreamrawRes=getResources().openRawResource(R.raw.le1);
BueredReaderinput=
newBueredReader(newInputStreamReader(rawRes));
Stringline=null;
while((line=input.readLine())!=null){
BueredReaderinterceptatodososmtodosde
contents.append(line+'\n');
InputStream,impondosobreessesmtodos
}
novoscomportamentos.Essepadrodeprojetos
}catch(IOExcep@onex){
ex.printStackTrace();chamasedecorador.
Em que outras
}
situaes
returncontents.toString();
Decoradores so
usados?
}

Lendoeexibindoarquivos
AulaAc@vity10.java

@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextViewtext=(TextView)ndViewById(R.id.textView);
text.setText(getTextFromFile());
}

Exerccios:Contraste
ModiqueaaplicaoSudoku,paraquea
visodojogotenhadoismodos:contrastee
semcontraste.Avisocomcontrastedeve
usarumfundobranco,elinhasmaiores
negras.
Essaopotambm
deveserdenidano
layoutde
preferncias,viaum
botodeseleo.

Exerccios:Contraste
ModiqueaaplicaoSudoku,paraquea
er o
visodojogotenhadoismodos:contrastee
Como deve s
de
t
u
o
y
a
l
o
v
o
n
semcontraste.Avisocomcontrastedeve
s?
preferncia
usarumfundobranco,elinhasmaiores
negras.
Essaopotambm
deveserdenidano
layoutde
preferncias,viaum
botodeseleo.

se^ngs.xml
<?xmlversion="1.0"encoding="uf8"?>
<PreferenceScreenxmlns:android="hjp://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:key="music"

android:@tle="@string/music_@tle"

android:summary="@string/music_summary"

android:defaultValue="true"/>
<CheckBoxPreference
s
android:key="hints"
Precisamo

android:@tle="@string/hints_@tle"
alterar
l
m
x
.
s

android:summary="@string/hints_summary"
g
n
i
r
st

android:defaultValue="true"/>
<CheckBoxPreference
android:key="contrast"

android:@tle="@string/constrast_Rtle"

android:summary="@string/constrast_summary"

android:defaultValue="true"/>
</PreferenceScreen>

strings.xml
<?xmlversion="1.0"encoding="uf8"?>
<resources>
...
<stringname="contrast_@tle">Contraste</string>
<stringname="contrast_summary">
Aumentarocontrastedatela
</string>
E como fica a
classe
...
Prefs.java?
</resources>

Prefs.java
publicclassPrefsextendsPreferenceAc@vity{
//Op@onnamesanddefaultvalues
privatesta@cnalStringOPT_CONTRAST="contrast";
privatesta@cnalbooleanOPT_CONTRAST_DEF=true;
...

Precisamos
agora aplicar o
contraste.

@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.layout.se^ngs);
}
publicsta@cbooleangetContrast(Contextcontext){
returnPreferenceManager.getDefaultSharedPreferences(context).getBoolean(
OPT_CONTRAST,OPT_CONTRAST_DEF);
}
}

Escolhendonovascores
Omododecontrastedeveusarlinhasgrandes
negras,efundobranco:

Escolhendonovascores
Omododecontrastedeveusarlinhasgrandes
negras,efundobranco:
<?xmlversion="1.0"encoding="uf8"?>
<resources>
...
<colorname="puzzle_big_lines">#000000</color>
<colorname="puzzle_light_background">#</color>
</resources>
E como, agora,
usar as
preferncias?

PuzzleView.java
if(Prefs.getContrast(getContext())){
background.setColor(getResources().getColor(R.color.puzzle_light_background));
}else{
background.setColor(getResources().getColor(R.color.puzzle_background));
}

if(Prefs.getContrast(getContext())){
dark.setColor(getResources().getColor(R.color.puzzle_big_lines));
}else{
dark.setColor(getResources().getColor(R.color.puzzle_dark));
}

Você também pode gostar