Escolar Documentos
Profissional Documentos
Cultura Documentos
Comecando A Desenvolver Aplicativos para Android
Comecando A Desenvolver Aplicativos para Android
1. package br.com.felipesilveira.hello_world;
2.
3. import android.app.Activity;
4. import android.os.Bundle;
5. import android.widget.TextView;
6.
7. public class HelloWorld extends Activity {
8.
/** Called when the activity is first created. */
9.
@Override
10. public void onCreate(Bundle savedInstanceState) {
11.
super.onCreate(savedInstanceState);
12.
TextView view = new TextView(this);
13.
view.setText("Hello, Android");
14.
setContentView(view);
15.
16. }
17. }
da classe Activity. Nos prximos artigos falaremos bastante sobre ela, suas caractersticas,
seu ciclo de vida e como manipul-la corretamente.
DICA: Alm de rodar a aplicao, voc pode explorar um pouco o emulador, para
conhecer o sistema operacional Android, caso ainda no conhea. Durante o
desenvolvimento, o emulador ser seu melhor amigo, ento essa a oportunidade para
conhec-lo bem.
Neste arquivo temos contato com os primeiros elementos de um arquivo de layout XML:
Para criar um layout parecido com o rascunho do incio do post, iremos inserir outros dois
elementos:
29. android:layout_height="wrap_content"
30. >
31. </ListView>
32. </LinearLayout>
Compilando as alteraes, temos a seguinte tela:
Para criar essa nova Activity, usaremos alguma funes do Motodev. Se voc no est
usando a IDE da Motorola, no tem problema s criar os arquivos manualmente. Porm
recomendo o uso da IDE, por facilitar bastante a nossa vida.
Vamos comear criando a Activity que dar Boas Vindas ao usurio.
V at o menu MOTODEV >New > New Android Activity. Na tela de configurao,
entre com o nome da Activity a ser criada:
14. <Button
15. android:id="@+id/welcome_ok_button"
16. android:layout_width="fill_parent"
17. android:layout_height="wrap_content"
18. android:text="Continuar"
19. >
20. </Button>
21. </TableLayout>
Este arquivo XML define uma Activity com um texto e um boto logo abaixo, com a
palavra Continuar.
Aps criado o arquivo, vamos carreg-lo no mtodo onCreate() da WelcomeActivity():
1. setContentView(R.layout.welcome);
Lanando a WelcomeActivity
Para lanar a WelcomeActivity a partir da MainActivity, usaremos a funo startActivity().
Esta funo recebe como parmetro um Intent. Posteriormente iremos aprofundar nosso
conhecimento sobre essa importante classe, mas por enquanto o que voc precisa saber
que ela usada para fazer a comunicao entre Activities.
No cdigo abaixo instanciamos um Intent cuja nica funo lanar a WelcomeActivity, e
ento o usamos como parmetro para a startActivity.
Dessa forma, o cdigo da MainActivity fica assim:
view plaincopy to clipboardprint?
1. package br.com.felipesilveira.quicknotes;
2.
3. import android.app.Activity;
4. import android.os.Bundle;
5. import android.content.Intent;
6.
7. public class MainActivity extends Activity {
8.
/** Called when the activity is first created. */
9.
@Override
10. public void onCreate(Bundle savedInstanceState) {
11.
super.onCreate(savedInstanceState);
12.
setContentView(R.layout.main);
13.
14.
Intent i = new Intent(this, WelcomeActivity.class);
15.
startActivity(i);
16. }
17. }
Todas estas funes recebem como parmetros duas strings a primeira, chamada de TAG,
e a segunda que a mensagem em si. A TAG uma string que ir identificar a sua
aplicao, tornando mais fcil identificar quais logs foram impressos por ela. (Todas as
aplicaes imprimem o log no mesmo stream. Assim, a nica forma de separar os seus logs
filtrando pela sua Tag)
uma boa prtica definir a TAG como uma string constante:
view plaincopy to clipboardprint?
1. private static final String TAG = "QuickNotesMainActivity";
Dessa forma, para imprimir um log de DEBUG basta usar a linha abaixo:
view plaincopy to clipboardprint?
1. Log.d(TAG, "mensagem de debug");
Content Providers
Os Content Providers so parte importantssima da arquitetura de um sistema android.
responsabilidade deles prover s aplicaes o contedo que elas precisam para funcionar,
ou seja, os dados.
Mas por que so realmente necessrios?
As aplicaes poderiam muito bem acessar diretamente um banco de dados, por exemplo.
Porm, uma boa prtica tornar o modo como os dados so gravados transparente
aplicao. Dessa forma, a aplicao pode manter o foco nas interaes com o usurio.
Alm disso, essa tcnica permite a criao de Shared Content Providers, que so providers
pblicos que podem ser acessados por vrias aplicaes. Por exemplo, existe o content
provider de SMS/MMS que permite a qualquer aplicao ler as mensagens recebidas por
um telefone celular.
E como feita a comunicao entre Content Providers e Aplicaes?
Uri. Guarde bem este nome, pois voc ir precisar muito dele durante a sua carreira como
desenvolvedor android.
Toda a comunicao entre aplicaes e providers feita atravs dos mtodos da interface
ContentProvider, que sempre recebem um objeto Uri como parmetro. O formato da
Uri definido pelo content provider. Por exemplo, a Uri content://sms/inbox acessa as
mensagens de inbox no Content Provider de SMS. Falaremos um pouco mais sobre as Uris
a seguir, mas primeiro, vamos conhecer os mtodos que usaremos para envi-las para o
provider:
dados.
para atualizar
dados.
5. import android.content.ContentValues;
6. import android.database.Cursor;
7.
8. public class QuickNotesProvider extends ContentProvider {
9.
// Aqui definimos os formatos possveis de Uri que
10. // o nosso provider ir aceitar.
11. public static final Uri CONTENT_URI = Uri
12. .parse("content://br.com.felipesilveira.quicknotes.quicknotesprovider");
13.
14. @Override
15. public int delete(Uri uri, String selection, String[] selectionArgs) {
16.
return 0;
17. }
18.
19. @Override
20. public String getType(Uri uri) {
21.
return null;
22. }
23.
24. @Override
25. public Uri insert(Uri uri, ContentValues values) {
26.
return null;
27. }
28.
29. @Override
30. public boolean onCreate() {
31.
return false;
32. }
33.
34. @Override
35. public Cursor query(Uri uri, String[] projection, String selection,
36.
String[] selectionArgs, String sortOrder) {
37.
return null;
38. }
39.
40. @Override
41. public int update(Uri uri, ContentValues values, String selection,
42.
String[] selectionArgs) {
43.
return 0;
44. }
45. }
Agora, vamos registrar o nosso provider no AndroidManifest, adicionando a seguinte linha
entre as tags <application > e </application>
<provider
android:authorities="br.com.felipesilveira.quicknotes.quicknotesprovider"
android:name=".QuickNotesProvider"/>
E assim o nosso Content Provider est pronto para receber requisies da aplicao. Ainda
no retorna nenhum resultado significativo mas isso faremos no prximo artigo, onde
ensinarei como acessar um banco de dados SQLite, para fazer esse provider realmente
efetivo.
DICA: Usando o MOTODEV Studio, a tarefa de criar um content provider fica muito mais
fcil. Basta acessar New > Android Content Provider, que um template ser criado, com
todos os mtodos! da s implementar a lgica deles.
A classe SQLiteOpenHelper
A classe SQLiteOpenHelper, como dito anteriormente, ser usada para gerenciar o banco
de dados. Para us-la, preciso criar uma subclasse implementando os mtodos abaixo:
onCreate() Este mtodo chamado quando a conexo com o banco de dados for
aberta pela primeira vez. aqui que criaremos o banco de dados, com o comando
sql CREATE.
onUpdate() Este mtodo chamado quando a verso do banco de dados muda.
Por exemplo, digamos que voc criou uma nova verso de seu aplicativo que usa
uma tabela a mais no banco de dados. Quando esta nova verso for instalada (em
um telefone que j possuir a primeira verso) este mtodo ser chamado, ento voc
poder criar apenas a nova tabela, mantendo os dados do usurio.
O cdigo
O cdigo do QuickNotesProvider fica assim, acessando o banco de dados. A seguir, eu
explico algumas coisas que podem gerar dvidas.
view plaincopy to clipboardprint?
1. package br.com.felipesilveira.quicknotes;
2.
3. import java.util.HashMap;
4.
5. import android.content.ContentProvider;
6. import android.content.ContentUris;
7. import android.content.Context;
8. import android.content.UriMatcher;
9. import android.net.Uri;
10. import android.provider.BaseColumns;
11. import android.content.ContentValues;
12. import android.database.Cursor;
13. import android.database.sqlite.SQLiteDatabase;
14. import android.database.sqlite.SQLiteOpenHelper;
15. import android.database.sqlite.SQLiteQueryBuilder;
16.
17. public class QuickNotesProvider extends ContentProvider {
18.
19. // Authority do nosso provider, a ser usado nas Uris.
20. public static final String AUTHORITY =
21.
"br.com.felipesilveira.quicknotes.quicknotesprovider";
22.
23. // Nome do arquivo que ir conter o banco de dados.
24. private static final String DATABASE_NAME = "quicknotes.db";
25.
26. // Versao do banco de dados.
27. // Este valor importante pois usado em futuros updates do DB.
28. private static final int DATABASE_VERSION = 1;
29.
30. // Nome da tabela que ir conter as anotaes.
31. private static final String NOTES_TABLE = "notes";
32.
33. // 'Id' da Uri referente s notas do usurio.
34. private static final int NOTES = 1;
35.
36. // Tag usada para imprimir os logs.
37. public static final String TAG = "QuickNotesProvider";
38.
39. // Instncia da classe utilitria
40. private DBHelper mHelper;
41.
42. // Uri matcher - usado para extrair informaes das Uris
43. private static final UriMatcher mMatcher;
44.
45. private static HashMap<string, string=""> mProjection;
46.
47. static {
48.
mProjection = new HashMap<string, string="">();
49.
mProjection.put(Notes.NOTE_ID, Notes.NOTE_ID);
50.
mProjection.put(Notes.TEXT, Notes.TEXT);
51. }
52.
53. static {
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
break;
155.
default:
156.
throw new IllegalArgumentException(
157.
"URI desconhecida " + uri);
158.
}
159.
160.
getContext().getContentResolver().notifyChange(uri, null);
161.
return count;
162.
}
163.
164.
/////////////////////////////////////////////////////////////////
165.
//
Inner Classes utilitrias
//
166.
/////////////////////////////////////////////////////////////////
167.
public static final class Notes implements BaseColumns {
168.
public static final Uri CONTENT_URI = Uri.parse("content://"
169.
+ QuickNotesProvider.AUTHORITY + "/notes");
170.
171.
public static final String CONTENT_TYPE =
172.
"vnd.android.cursor.dir/" + QuickNotesProvider.AUTHORITY;
173.
174.
public static final String NOTE_ID = "_id";
175.
176.
public static final String TEXT = "text";
177.
}
178.
179.
private static class DBHelper extends SQLiteOpenHelper {
180.
181.
DBHelper(Context context) {
182.
super(context, DATABASE_NAME, null, DATABASE_VERSION)
;
183.
}
184.
185.
/* O mtodo onCreate chamado quando o provider executado pela
186.
* primeira vez, e usado para criar as tabelas no database
187.
*/
188.
@Override
189.
public void onCreate(SQLiteDatabase db) {
190.
db.execSQL("CREATE TABLE " + NOTES_TABLE + " (" +
191.
Notes.NOTE_ID + " INTEGER PRIMARY KEY AUTOINCR
EMENT," +
192.
Notes.TEXT + " LONGTEXT" + ");");
193.
}
194.
195.
/* O mtodo onUpdate invocado quando a verso do banco de dados
196.
* muda. Assim, usado para fazer adequaes para a aplicao
197.
* funcionar corretamente.
198.
*/
199.
@Override
200.
public void onUpgrade(SQLiteDatabase db,
201.
int oldVersion, int newVersion) {
202.
203.
204.
205.
206.
207.
Cursores
O primeiro conceito importante a se falar o conceito dos Cursores. Como voc deve
percebido, este o tipo de retorno do mtodo query(), e no por acaso: Os cursores so
apontadores de dados do banco de dados ou seja, uma interface que permite o acesso
aos dados retornados pela query enviada pelo usurio.
notifyChanges()
Em todos os mtodos em que alteramos o banco de dados (inserimos, deletamos ou
modificamos dados) importante chamar o mtodo modifyChanges(). Isso far com que as
aplicaes que estejam utilizando este conjunto de dados sejam notificadas, permitindo a
estas atualizar tambm os dados mostrados ao usurio.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52. }
}
// Definindo um OnClickListener para o boto "Inserir"
private OnClickListener mInsertListener = new OnClickListener() {
public void onClick(View v) {
EditText editBox = (EditText)findViewById(R.id.edit_box);
addNote(editBox.getText().toString());
editBox.setText("");
}
};
/*
* Mtodo responsvel por inserir um registro no content provider
*/
protected void addNote(String text) {
ContentValues values = new ContentValues();
values.put(QuickNotesProvider.Notes.TEXT, text);
getContentResolver().insert(
QuickNotesProvider.Notes.CONTENT_URI, values);
}