Armazenamento Persistente de Dados



Documentos relacionados
Programação para a Plataforma Android Aula 7. Mul$mídia

Comunicação entre A0vidades

Programação para a Plataforma Android Aula 11. Banco de Dados

Provedores de Conteúdo

Programação para Dispositivos Móveis

Apresentação de um Processo Cria4vo de Desenvolvimento de uma App Android. Realização de Dinâmica Hands- On para Construção de uma App Android

Programação para Android. Aula 06: Activity, menus e action bar

Introdução ao Android. SECAP 2014 Prof. Rone Ilídio - UFSJ

Programa de Dispositivos Móveis

Módulo 4 - Interface Gráfica Gerenciadores de Layout. Programação Orientada a Objetos Prof. Rone Ilídio - UFSJ

Android Banco de Dados. Ivan Nicoli

Programação para a Plataforma Android Aula 16. Fragmentos

Programação para Dispositivos Móveis

Programação para Android. Aula 08: Persistência de dados SQL

Log, Ciclo de Vida e Diálogos. Prof. Fellipe Aleixo (fellipe.aleixo@ifrn.edu.br)

Comunicação via Sockets

Desenvolvimento para Android Prá9ca 2. Prof. Markus Endler

Programação para Android. Aula 07: Persistência de dados Shared Preferences, Internal e External Storage

Módulo 2 - Novas Activities Android. Programação Orientada a Objetos Prof. Rone Ilídio - UFSJ

Programação de Dispositivos Móveis

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS

Android Layout Manager. Ivan Nicoli

Programação para Android. Aula 10: Acesso a câmera, sms e recursos do aparelho

Introdução ao Android. Programação Orientada a Objetos Prof. Rone Ilídio - UFSJ

Desenvolvimento com Android Studio. Aula 02 Widgets, Manipulação de Dados e Programação de Eventos

Analisar os sistemas operacionais apresentados na figura e responder as questões abaixo: Identificar

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Programação para Android. Aula 05: Estilos e temas; galeria de imagens

Android: Ciclo de vida da Activity

Desenvolvimento Android.

Desenvolvimento para Android Prá3ca 3. Prof. Markus Endler

Programação em Java para a Plataforma Android AULA 1. Primeiros Passos

Programação de Dispositivos Móveis

Programação para Dispositivos Móveis

Prof. Jhonatan Fernando

Android Core. Felipe Silveira felipesilveira.com.br. Aula 6

Programa de Dispositivos Móveis

PROPOSTA DE UM PADRÃO DE PROJETO PARA ANDROID UTILIZANDO A WEB

Programação de Computadores - I. Profª Beatriz Profº Israel

Capítulo 07: Câmera e Arquivos

Login. Criar uma nova Activity. Login. Luiz Eduardo Guarino de Vasconcelos

JSP - ORIENTADO A OBJETOS

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

ANDROID APPLICATION PROJECT

AULA 2. Minicurso PET-EE UFRN

Seu App na TV: Desenvolvimento para ChromeCast

Interfaces Gráficas parte 3

insfcanceof new public switch transient while byte continue extends for int null

Repeater no GASweb. Regiões

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS

Permissão de Usuários

INTRODUÇÃO À PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS. ADS 6º Período

Persistência de Classes em Tabelas de Banco de Dados

Programação Orientada a Objetos II

( TIAGO DOS SANTOS MENDES ) PROGRAMAÇÃO DISPOSITIVOS MOVEIS ANDROID STUDIO

Chromecast. Seu aplicativo na TV. Ivan de

CAPA Área de utilização para ilustração MANUAL w-vpn

itec h- ON & E ngenharia de S oftware Joel Carvalho - 05/05/2011 Novas Tecnologias Aplicadas à Eng. de So5.

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

Android Básico Hello World!

2 Orientação a objetos na prática

Programação para Dispositivos Móveis

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS

Google Android. Uma abordagem prática e didática. Rafael Guimarães Sakurai, Diogo Carleto, erodrigo Cascarrolho

Olá, esse é o manual feito para ajudar você a conhecer ainda mais o Painel Web que acompanha* App Kontrole.

Capítulo 04: Persistência com SQLite

Retrofit. Criar um novo projeto. Selecionar a API. Retrofit para consumir Web Service Luiz Eduardo Guarino de Vasconcelos

Aula 30 - Sockets em Java

Definições de Projeto

Adicionando Caixas de Verificação no seu Programa Java

Introdução ao Android

Tutorial Android Speech

WEBDESIGN. Professor: Paulo Marcos Trentin - paulo@paulotrentin.com.br Escola CDI de Videira

Configurando um Grupo Doméstico e Compartilhando arquivos no Windows 7

HCI Summer Workshop. Android #1. Tiago Guerreiro.

9 Comandos condicionais

Exercícios de Revisão Java Básico

POO Programação Orientada a Objetos. Classes em Java

INTRODUÇÃO AO JAVA PARA PROGRAMADORES C

Como construir um compilador utilizando ferramentas Java

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

Manual de Utilização do Zimbra

É o UniNorte facilitando a vida de nossos docentes e discentes.

Computação II Orientação a Objetos

Fluxo de trabalho do Capture Pro Software: Indexação de código de barras e separação de documentos

Técnicas de Programação II

Ler e escrever bytes, caracteres e Strings de/para a entrada e saída padrão. Ler e escrever bytes, caracteres e Strings de/para arquivos

A ) O cliente terá que implementar uma interface remota. . Definir a interface remota com os métodos que poderão ser acedidos remotamente

Android Activity. Ivan Nicoli

Transcrição:

Programação para a Plataforma Android Aula 10 Armazenamento Persistente de Dados Como armazenar as opções de preferência de uma aplicação? Como tocar músicas em uma a@vidade Android? Como armazenar dados usando Bundles? Como usar o sistema de arquivos do aparelho celular? Como manipular arquivos de texto em Java? Como armazenar objetos diretamente em arquivos?

Armazenamento Permante Dados armazenados permanentemente não desaparecem quando a aplicação termina sua execução. Em que situações precisamos de armazenamento persistente? Pense em aplicações Android que usam persistência.

Armazenamento Permante Dados armazenados permanentemente não desaparecem quando a aplicação termina sua execução. Guardar a lista de compras; Armazenar a lista de endereços; Lembrar a posição das peças de xadrez no tabuleiro; Armazenar as opções escolhidas para uma aplicação; etc

Muitas formas de Armazenamento A API de preferências Estados de Bundles Arquivos de armazenamento em memória flesh Etc

Preferências Nosso Sudoku possui um menu de opções. Você lembra como isso foi implementado?

Sudoku.java Preferências public boolean onop@onsitemselected(menuitem item) { switch (item.getitemid()) { case R.id.se^ngs: startac@vity(new Intent(this, Prefs.class)); return true; return false; O que esse método está fazendo? Modifique a classe Prefs para que ela armazene e retorne as preferências escolhidas pelo usuário. public class Prefs extends PreferenceAc@vity { @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); addpreferencesfromresource(r.layout.se^ngs); Prefs.java

se^ngs.java Preferências <?xml version="1.0" encoding="uf 8"?> <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> public class Prefs extends PreferenceAc@vity { @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); addpreferencesfromresource(r.layout.se^ngs); Prefs.java

Armazenamento de Preferências public class Prefs extends PreferenceAc@vity { private sta@c final String OPT_MUSIC = "music"; private sta@c final boolean OPT_MUSIC_DEF = true; private sta@c final String OPT_HINTS = "hints"; private sta@c final boolean OPT_HINTS_DEF = true;... public sta@c boolean getmusic(context context) { return PreferenceManager.getDefaultSharedPreferences (context).getboolean(opt_music, OPT_MUSIC_DEF); public sta@c boolean gethints(context context) { return PreferenceManager.getDefaultSharedPreferences (context).getboolean(opt_hints, OPT_HINTS_DEF); Como dá-se a comunicação entre o que entra nesse banco de dados e o que sai dele? Como aplicar essas preferências? Prefs.java

Music.java Tocar ou não tocar uma música? public sta@c void play(context context, int resource) { stop(context); mp = MediaPlayer.create(context, resource); mp.setlooping(true); mp.start(); public sta@c void play(context context, int resource) { stop(context); if (Prefs.getMusic(context)) { mp = MediaPlayer.create(context, resource); mp.setlooping(true); mp.start(); A class Prefs comporta-se como um singleton. E como habilitar ou desabilitar as dicas?

PuzzleView.java Removendo as dicas if (Prefs.getHints(getContext())) { Paint hint = new Paint(); int c[] = { getresources().getcolor(r.color.puzzle_hint_0), getresources().getcolor(r.color.puzzle_hint_1), getresources().getcolor(r.color.puzzle_hint_2), }; Rect r = new Rect(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { int moveslew = 9 game.getusedtiles(i, j).length; if (moveslew < c.length) { getrect(i, j, r); hint.setcolor(c[moveslew]); canvas.drawrect(r, hint);

Con@nuando um Jogo A opção continue Modifique a nossa implementação de Sudoku para que seja possível interromper e continuar um jogo interrompido. Seria possível usar a API de preferências? No fundo, tratase de uma tabela hash persistente!

Game.java Como um jogo novo é ob@do private int[] getpuzzle(int diff) { String puz; switch (diff) { case DIFFICULTY_HARD: puz = hardpuzzle; break; case DIFFICULTY_MEDIUM: puz = mediumpuzzle; break; case DIFFICULTY_EASY: default: puz = easypuzzle; break; return frompuzzlestring(puz); Podemos adicionar uma nova opção, para que seja possível escolhermos o puzzle a partir da tabela de preferências! Como fazer isso?

private int[] getpuzzle(int diff) { String puz; switch (diff) { case DIFFICULTY_CONTINUE: puz = getpreferences(mode_private).getstring(pref_puzzle, easypuzzle); break; case DIFFICULTY_HARD: puz = hardpuzzle; break; Game.java case DIFFICULTY_MEDIUM: puz = mediumpuzzle; break; case DIFFICULTY_EASY: default: puz = easypuzzle; break; return frompuzzlestring(puz); Que constante é essa? E como colocar o estado do tabuleiro na tabela de preferências? Procure pensar nos eventos necessários para essa tarefa Quando o puzzle deve ser salvo?

Game.java onpause public class Game extends Ac@vity { private sta@c final String PREF_PUZZLE = "puzzle" ; @Override protected void onpause() { super.onpause(); Log.d(TAG, "onpause"); Music.stop(this); Vocês lembram-se dessa função? getpreferences(mode_private).edit().putstring(pref_puzzle, topuzzlestring(puzzle)).commit();

Game.java topuzzlestring sta@c private String topuzzlestring(int[] puz) { StringBuilder buf = new StringBuilder(); for (int element : puz) { buf.append(element); return buf.tostring(); E como podemos começar um jogo que havia sido interrompido? Em outras palavras, como tratar o botão continue? Onde está o código que lida com eventos de clique dessa atividade?

Eventos de Clique Sudoku.java public void onclick(view v) { switch (v.getid()) { case R.id.about_bujon: Intent i = new Intent(this, About.class); startac@vity(i); break; case R.id.new_bujon: opennewgamedialog(); break; case R.id.exit_bujon: finish(); break; E como alterar essa classe para que o botão continue possa funcionar?

Eventos de Clique Sudoku.java public void onclick(view v) { switch (v.getid()) { case R.id.conRnue_buSon: startgame(game.difficulty_continue); break; case R.id.about_bujon: Intent i = new Intent(this, About.class); startac@vity(i); break; case R.id.new_bujon: opennewgamedialog(); break; case R.id.exit_bujon: finish(); break; Ei, mas está faltando associar o evento ao botão!

Botões e Eventos @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); View aboutbujon = findviewbyid(r.id.about_bujon); aboutbujon.setonclicklistener(this); View newbujon = findviewbyid(r.id.new_bujon); newbujon.setonclicklistener(this); View exitbujon = findviewbyid(r.id.exit_bujon); exitbujon.setonclicklistener(this); View conrnuebuson = findviewbyid(r.id.conrnue_buson); conrnuebuson.setonclicklistener(this);

Orientação da Tela Se virarmos a tela em modo paisagem, nossa aplicação perde a informação sobre onde estava o cursor: Como resolver esse problema?

Estado da Visão Toda visão possui um estado: posição do cursor, números, etc. Quando trocamos a visão, o método ondraw da visão é invocado. Por que a posição dos números é salva entre modo retrato e paisagem? E como podemos agora salvar a posição do cursor?

Bundles Bundles são tabelas usadas para passar dados entre A@vidades. Podem ser a@vidades diferentes Ou a mesma a@vidade, no passado e no futuro. Nesse caso, toda a@vidade usa dois métodos: protected Parcelable onsaveinstancestate() protected void onrestoreinstancestate (Parcelable state)

Salvando Estados PuzzleView.java @Override protected Parcelable onsaveinstancestate() { Parcelable p = super.onsaveinstancestate(); Bundle bundle = new Bundle(); bundle.putint(selx, selx); bundle.putint(sely, sely); bundle.putparcelable(view_state, p); return bundle; É claro: convém não esquecer as constantes E como seria o método que restaura o estado da atividade?

Restaurando Estados PuzzleView.java @Override protected void onrestoreinstancestate(parcelable state) { Log.d(TAG, "onrestoreinstancestate"); Bundle bundle = (Bundle) state; select(bundle.getint(selx), bundle.getint(sely)); super.onrestoreinstancestate(bundle.getparcelable(view_state)); return; Como foi amarrada essa ligação entre o estado salvo e o estado restaurado? Falta, agora, encontrar um identificador para a visão.

Iden@ficadores public class PuzzleView extends View { private starc final int ID = 42;... public PuzzleView(Context context) { super(context); this.game = (Game) context; setfocusable(true); setid(id); setfocusableintouchmode(true);... E porque não colocamos o identificador de PuzzleView em um arquivo XML?

Preservando o Estado da A@vidade Notem que apenas a posição do cursor está sendo salva. Os números no tabuleiro não estão sendo salvos. Consertar essa lacuna fica como um exercício. Mas isso não é fácil: a visão não manipula puzzles!

O Sistema de Arquivos Android OS é Linux. E portanto, possui um sistema de arquivos. Arquivos podem ser manipulados pelas classes na biblioteca java.io. Cada aplicação possui seu próprio espaço. Normalmente data/data/nome_pacote E a classe Context possui métodos para manipular os arquivos armazenados nesse espaço.

Manipulação de Arquivos A classe Context possui diversos métodos para manipular arquivos: deletefile: apaga um arquivo e retorna verdadeiro caso a deleção tenha acontecido. filelist: retorna um arranjo de strings com o nome dos arquivos no espaço da aplicação. openfileinput: abre um arquivo para leitura. openfileoutput: abre um arquivo para escrita.

Arquivos de Texto Podemos armazenar qualquer @po de arquivo como recursos crus, em res/raw/ Exibição de texto Implemente uma classe que abra, leia e exiba o conteúdo de um arquivo de texto armazenado em res/raw/file1.txt Como fazer isso em Java, versão desktop? E haveria alguma diferença em Android? Como deveria ser o layout dessa aplicação?

ScrollLayout Como ler o conteúdo do arquivo? <?xml version="1.0" encoding="u5 8"?> <LinearLayout xmlns:android="h9p://schemas.android.com/apk/res/android" android:orienta@on="verbcal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ScrollView xmlns:android= "h9p://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dip"> <TextView android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </ScrollView> </LinearLayout>

AulaAc@vity10.java private String readtext() { InputStream inputstream = getresources().openrawresource(r.raw.file1); ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(); int i; try { i = inputstream.read(); while (i!= 1) { bytearrayoutputstream.write(i); i = inputstream.read(); inputstream.close(); catch (IOExcep@on e) { e.printstacktrace(); return bytearrayoutputstream.tostring(); Lendo um Arquivo Algum problema com esse método?

AulaAc@vity10.java Bufferização private String gettextfromfile() { StringBuffer contents = new StringBuffer(); try { InputStream rawres = getresources().openrawresource(r.raw.file1); BufferedReader input = new BufferedReader(new InputStreamReader(rawRes)); String line = null; while ((line = input.readline())!= null) { contents.append(line + '\n'); catch (IOExcep@on ex) { ex.printstacktrace(); return contents.tostring(); Arquivos podem ser lidos ou escritos de várias formas diferentes. Como usar esse método?

Decoradores private String gettextfromfile() { StringBuffer contents = new StringBuffer(); try { InputStream rawres = getresources().openrawresource(r.raw.file1); BufferedReader input = new BufferedReader(new InputStreamReader(rawRes)); String line = null; while ((line = input.readline())!= null) { BufferedReader intercepta todos os métodos de contents.append(line + '\n'); InputStream, impondo sobre esses métodos novos comportamentos. Esse padrão de projetos catch (IOExcep@on ex) { ex.printstacktrace(); chama se decorador. return contents.tostring(); Em que outras situações Decoradores são usados?

Lendo e exibindo arquivos AulaAc@vity10.java @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); TextView text = (TextView) findviewbyid(r.id.textview); text.settext(gettextfromfile());

Exercícios: Contraste Modifique a aplicação Sudoku, para que a visão do jogo tenha dois modos: contraste e sem contraste. A visão com contraste deve usar um fundo branco, e linhas maiores negras. Essa opção também deve ser definida no layout de preferências, via um botão de seleção.

Exercícios: Contraste Modifique a aplicação Sudoku, para que a visão do jogo tenha dois modos: contraste e sem contraste. A visão com contraste deve usar um fundo branco, e linhas maiores negras. Essa opção também deve ser definida no layout de preferências, via um botão de seleção. Como deve ser o novo layout de preferências?

se^ngs.xml <?xml version="1.0" encoding="uf 8"?> <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" /> <CheckBoxPreference android:key="contrast" android:@tle="@string/constrast_rtle" android:summary="@string/constrast_summary" android:defaultvalue="true" /> </PreferenceScreen> Precisamos alterar strings.xml

strings.xml <?xml version="1.0" encoding="uf 8"?> <resources>... <string name="contrast_@tle">contraste</string> <string name="contrast_summary"> Aumentar o contraste da tela </string>... </resources> E como fica a classe Prefs.java?

Prefs.java public class Prefs extends PreferenceAc@vity { // Op@on names and default values private sta@c final String OPT_CONTRAST = "contrast"; private sta@c final boolean OPT_CONTRAST_DEF = true;... Precisamos agora aplicar o contraste. @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); addpreferencesfromresource(r.layout.se^ngs); public sta@c boolean getcontrast(context context) { return PreferenceManager.getDefaultSharedPreferences(context).getBoolean( OPT_CONTRAST, OPT_CONTRAST_DEF);

Escolhendo novas cores O modo de contraste deve usar linhas grandes negras, e fundo branco:

Escolhendo novas cores O modo de contraste deve usar linhas grandes negras, e fundo branco: <?xml version="1.0" encoding="uf 8"?> <resources>... <color name="puzzle_big_lines">#ff000000</color> <color name="puzzle_light_background">#ffffffff</color> </resources> E como, agora, usar as preferências?

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));