programação para dispositivos móveis -...
TRANSCRIPT
Programação para Dispositivos MóveisProfessor Ariel da Silva DiasDesenvolvendo para Android
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Android Core
▪ Uma aplicação Android é formada por um conjunto de componentes;
▪ A este conjunto damos o nome de Android Core.
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Activity
Broadcast Receiver
AndroidManifest
Service
ContentProvider
Android Manifest
▪ O AndoidManifest.xml é um arquivo que apresenta informações essenciais sobreo aplicativo android;
▪ Este é um arquivo que necessariamente tem que ter em todo aplicativo;
▪ As informações contidas neste arquivo são necessárias para que o sistema possaexecutar o código do aplicativo.
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Android Manifest
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.rally.cya.aula3">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".Activity1">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Activity2"></activity>
</application>
</manifest>
Permissões de Acesso
▪ Para realizar determinados tipos de operações, a aplicação deve solicitar permissão
▪ As permissões são configuradas no AndroidManifest.xml
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Activity
▪ Uma Activity representa uma tela da aplicação
▪ Representada por uma classe que herda de Activity
▪ Quase todas as activities interagem com o usuário, portanto, a classe Activitycuida da criação de uma janela na qual você pode colocar sua interface comsetContentView (View)
▪ As Activities no sistema são gerenciadas como uma pilha de activities. Quandouma nova Activity é iniciada, ela é colocada no topo da pilha e se torna a Activityem execução - a Activity anterior permanece sempre abaixo dela na pilha e nãovoltará ao primeiro plano até que a nova Activity saia.
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Activity
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
public class Activity3 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_3);
}
}
Pilha de Activities
Sistema Operacional Android
Aplicações
Aplicação 1 Aplicação 2 Aplicação n
Activity 1 Activity 1 Activity 1
Activity 2 Activity 2 Activity 2
Activity 3 Activity 3
Activity 4
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Classe Context
▪ Representa o contexto de execução da aplicação do Android
▪ Possui muitos métodos que são comumente chamados em aplicações
▪ Um objeto desta classe está normalmente disponível em vários lugares daaplicação
▪ A classe Activity herda de Context
▪ O Context é fornecido como parâmetro
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Classe Context
▪ O Android tem basicamente dois tipos de contextos
▪ Contexto da activity
▪ Cada activity da aplicação tem um contexto
▪ Contexto da aplicação
▪ É único para a aplicação toda
▪ É preciso tomar cuidado na escolha do contexto para não causar memory leaksna aplicação (vazamento de memória)
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Classe Context
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
public class Activity3 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_3);
EditText caixaTexto = new EditText(this);
EditText entradaDados = new EditText(getApplicationContext());
}
}
Views
▪ Views são os componentes que se agrupam para montar a interface gráfica
▪ As activities e as views têm uma relação próxima
▪ Activities representam a tela
▪ Views representam o que é renderizado na tela
▪ O método setContentView() da activity é utilizado para determinar qual viewserá renderizada
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Views
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
▪ Neste exemplo, setContentView renderiza a view R.layout.activity_3
public class Activity3 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_3);
}
}
Métodos durante o ciclo de vida de uma activity
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Métodos durante o ciclo de vida de uma activity
▪ OnCreate()- Primeira método a ser executado quando a Activity é iniciada. Responsável por carregar os layouts XML e outras operações de inicialização. Executado apenas uma vez durante o ciclo de vida.
▪ OnStart()- Chamada logo após o OnCreate() terminar – e também quando uma Activityque estava em background volta a possuir foco.
▪ OnResume() - Chamado na inicialização da Activity (após OnStart()) e também quando uma Activity volta a possuir foco e esta pronta para interagir com o usuário;
▪ OnPause() - Primeira método invocado quando a Activity perde o foco (quando outra Activity vem à frente) e vai para segundo plano;
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Métodos durante o ciclo de vida de uma activity
▪ OnStop() – Chamado quando a Activity fica totalmente encoberta por outraActivity e não é mais visível pelo usuário
▪ OnDestroy() - Último método chamado antes de destruir e remover a atividadeda memória. Após ele, a Activity é considerada “morta” – isto é, não pode maisser relançada. Se o usuário voltar a solicitar essa Activity, outro objeto será
construído.
▪ OnRestart() - Chamado antes da OnStart(), quando uma Activity volta a ter o focodepois de estar em background.
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Métodos durante o clico de vida de uma activity
onCreate()
onStart()
onResume() onPause()
onStop()
onDestroy()onRestart()
Foreground Lifetime
Visible Lifetime
Entire Lifetime
Executando
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Invocando Activities
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
▪ Uma aplicação é composta por um conjunto de activities
▪ Para enviarmos objetos/conteúdo de uma activity para outra, utilizamos as intents
▪ Um objeto intent é usado para disparar uma nova activity
▪ O primeiro parâmetro refere-se a activity que está invocando, enquanto o segundorefere-se a activity invocada (no nosso caso, respectivamente Activity1 aqui representadapor this e Activity2)
▪ O método StartActivity é usado para iniciar uma nova activity, que será colocada no topoda pilha de activities. É preciso um único argumento, uma Intent , que descreve aatividade a ser executada.
Intent it = new Intent(this,Activity2.class);
startActivity(it);
Invocando Activities
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
▪ As intents permitem iniciar uma activity em outro aplicativo, fornecendo umaação simples a ser executada em um objeto Intent.
▪ Esse tipo de intente chamamos de “intent implícito” pois não especifica ocomponente do aplicativo a iniciar. Em vez disso, ela especifica uma ação quefornece alguns dados com os quais realizar a ação.
▪ Ao chamar startActivity() e passar um intent implícito, o sistema resolve a intentpara um aplicativo que pode processar a intent e inicia a Activity correspondente.
▪ Se há mais de um aplicativo que pode processar a intent, o sistema apresenta aousuário uma caixa de diálogo para escolher o aplicativo a usar.
Passagem de Parâmetros
Activity1.java Activity2.java
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
▪ O bundle é uma espécie de struct emC, responsável por armazenar osvalores a serem transferidos para aActivity 2;
▪ O primeiro parâmetro é uma chave deidentificação e o segundo é o valor.
public void chamarActivity(View view) {
Intent it = new Intent(this,Activity2.class);
Bundle b = new Bundle();
b.putInt("idade",35);
it.putExtras(b);
startActivity(it);
}
▪ O primeiro passo é pegar a intent queinvocou e atribuir a uma variável domesmo tipo;
▪ Depois, extraímos da intent o bundle eatribuímos a uma variável do mesmotipo;
▪ Por fim, extraímos do bundle o valorenviado, para isso utilizamos a chavede identificação atribuída na Activity1.
Intent it = getIntent();
Bundle b = it.getExtras();
int id = b.getInt("idade");
Salvando o Estado de uma Activity
▪ Uma activity pode ser destruída pelo Android para liberar recursos
▪ Quando ela for recriada, é possível que informações da activity sejam perdidas • Para evitar que isto aconteça, é necessário salvar o estado da activity
▪ Não é preciso se preocupar com o estado das views, pois ele é gravado e depois recuperado
▪ É preciso que a view tenha um ID especificado
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Salvando o Estado de uma Activity – onSaveInstanceState()
▪ O Android chama o método onSaveInstanceState() na activity quando ela não fica mais visível
▪ Quando a activity é destruída, o estado dela fica guardado
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
@Override
protected void onSaveInstanceState(Bundle b) {
b.putString("nome","José");
b.putInt("idade",50);
b.putDouble("peso",78.2);
/*
CÓDIGO QUALQUER....
*/
super.onSaveInstanceState(b);
}
Salvando o Estado de uma Activity – onRestoreInstanceState()
▪ Quando a activity for recriada, o Android chama o método onCreate() passandocomo parâmetro o bundle que contém os dados salvos
▪ O bundle aqui trabalha como uma memória cache
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity1);
String nome; int num; double p;
if(savedInstanceState != null){
nome = savedInstanceState.getString("nome");
num = savedInstanceState.getInt("idade");
p = savedInstanceState.getDouble("peso");
}
}
Resource
▪ Exemplos de recursos (resources)
▪ Textos
▪ Imagens
▪ Sons
▪ Layouts de tela
▪ O ideal é não referenciar os resources diretamente no código
▪ Repetição de código
▪ Difícil de manter
▪ O Android possui mecanismos para trabalhar com resources de forma fácil e centralizada
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Resource - String
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Resource - String
Sem uso de Resource Com uso de Resource
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Resource - Color
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Classe Resource
▪ A classe Resource é um recurso do Android para referenciar resources no código
▪ Ela é gerada automaticamente
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Button b = new Button(this);
b.setText(R.string.botao_OK);
Referenciando Resource no XML
▪ Convenção para referenciar Resource
Resource Dentro do Código Dentro do XML
String Resource.string.<nomeResource> @string/<nomeResource>
Color Resource.color.<nomeResource> @color/<nomeResource>
Drawable Resource.drawable.<nomeResource> @drawable/<nomeResource>
... ... ...
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Arquivo de Layout
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Relação XML e Java
▪ O arquivo de layout XML não possui relação com o arquivo Java, ou seja,enquanto o primeiro é apenas a interface, o segundo é apenas a parte lógica;
▪ Em XML não conseguimos colocar ação no botão ou codificar os componentes;
▪ Desta forma, quando desejamos capturar o valor de uma EditText e, ao clicar nobotão este valor ser atribuído à uma TextView, devemos utilizar dos recursoscomo ids e o método findViewById.
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Relação XML e Java
▪ Nos próximos slides, faremos uma aplicação onde o usuário informa o nome emuma EditText e ao clicar no botão o nome será apresentado em uma TextView;
▪ Utilizaremos o LinearLayout por ser mais fácil de se apresentar na tela;
▪ Utilizaremos a seguinte sequência de views no XML:
▪ TextView com texto: “Digite seu nome”
▪ EditText
▪ Button
▪ TextView que será responsável por apresentar o nome da pessoa
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Definindo as views e seus IDs
▪ Algumas vezes é necessário definir seus próprios IDs para as views, afim dereferenciá-las posteriormente dentro do código java
▪ É recomendado que todas as views possuam um ID
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Definindo as views e seus IDs
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Activity1">
<TextView
android:id="@+id/texto1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/entradaTexto"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/botao1"
android:text="@string/botao_OK"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/apresentaTexto"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Fazendo cast
▪ O nosso layout está pronto e as views estão na tela
▪ Agora precisamos criar as views no java e, em seguida, atribuir os ids do XMLpara esta variáveis no código fonte
▪ Neste criaremos a relação entre Layout e Lógica (código fonte)
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Fazendo cast
▪ O nosso layout está pronto e as views estão na tela
▪ Agora precisamos criar as views no java e, em seguida, atribuir os ids do XMLpara esta variáveis no código fonte
▪ Neste criaremos a relação entre Layout e Lógica (código fonte)
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Fazendo cast
▪ Iremos interagir com apenas 2 views: EditText de entrada de texto e a TextViewpara mostrar a entrada de texto
▪ Desta forma, utilizaremos o método findViewById() para recuperarmos o componente do layout XML e atribuí-lo à variável do tipo correspondente no código fonte
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
TextView mostraResultado;
EditText caixaDeTexto;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity1);
mostraResultado = findViewById(R.id.apresentaTexto);
caixaDeTexto = findViewById(R.id.entradaTexto);
}
Ação para o botão
▪ O nosso botão está sem ação, o próximo passo é criarmos esta ação
▪ No arquivo de layout XML, vá até o botão criado e adicione o atributo onclick
▪ Criamos um método chamado “capturarNome” no atributo onclick, porém ele aparece com um erro
▪ Isso ocorre pois o método ainda não foi criado na classe Java, então:▪ Clique sobre o método capturarNome e, em seguida pressione as teclas alt + enter
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Ação para o botão
▪ Abrirá um menu com várias opções
▪ Dentre elas, escolha
▪ Create ‘capturarNome(View)’ in ‘Activity1’
▪ Com isso o método será criado automaticamente na classe Activity1.java
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Codificando o método capturarNome()
▪ Na classe Activity1.java, vamos codificar o método criado anteriormente conforme a imagem abaixo:
▪ Capturamos o valor da EditText chamada caixaDeTexto;
▪ Atribuímos o valor à variável nome do tipo String;
▪ Chamamos o método setText() da TextView mostraResultado e atribuímos o valor da variável nome;
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
public void capturarNome(View view) {
String nome;
nome = caixaDeTexto.getText().toString();
mostraResultado.setText(nome.toString());
}
Atividade
▪ Veja as atividades propostas no site www.arieldias.com
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda
Referências
▪ Documentação Xamarin. Disponível em: https://docs.microsoft.com/pt-br/xamarin/. Acessado em: agosto/2018
▪ Documentação Android. Disponível em: https://developer.android.com/.Acessado em agosto/2018
▪ Lecheta, Ricardo. Android Essencial. Editora Novatec, 2016
Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda