Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros...

33
Intents

Transcript of Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros...

Page 1: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Intents

Page 2: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Intent Objetos responsáveis por passar informações, como se

fossem mensagens, para os principais componentes da API do Android, como as Activities, Services e BroadCast Receivers.

Para que um destes componentes seja instanciado, é necessário que seja criado um Intent, mesmo quando não temos nenhuma informação para passar para o componente criado.

Quando usado em conjunto com Intent Filters podemos até iniciar uma Activity de outros aplicativo, ou o inverso, deixar que um outro aplicativo inicie uma das nossas Activities.

2

Page 3: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Usando o Intent com Activities

é necessário usar o método

startActivity() presente no objeto

Context, ou na Activity.

Intent intent = new Intent (this , NewActivity.class );

startActivity ( intent );

3

Page 4: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Usando Intents para passar dados

pode ser feito utilizando o método putExtra

do Intent.

Quem passa os dados faz o seguinte:

Intent intent = new Intent (this , NewActivity.class );

intent.putExtra ("curso", "Android");

intent.putExtra (“turma", “DAW3");

intent.putExtra (“alunos", 08) ;

4

Page 5: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Usando Intents para passar dados

Quem recebe os dados faz o seguinte:

Bundle extras = getIntent().getExtras();

String curso = extras.getString ("curso");

String turma = extras.getString (“turma");

int nroAlunos = extras.getInt (“alunos");

5

Page 6: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Intent Filter

Criação de filtros que determinam quais Intents devem ser executadas

para cada mensagem <activity android:name=".HelloActivity"

android:label="@string/app_name">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

Action = MAIN

Diz que activity é um ponto de partida, semelhante ao public static void main()

da Java

Category = LAUNCHER

Indica que o ícone da activity deverá aparecer na tela pode ser aberta pelo

usuário 6

Page 7: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Abrindo outros aplicativos

Dependendo do tipo de action passada, um novo aplicativo será aberto para executar a ação.

Este tipo de intent é chamado de implícito, porque não é especificado qual a activity que será aberta.

Apenas passamos uma ação, e o sistema irá decidir qual activity deverá ser utilizada nesse caso.

7

Page 8: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Exemplo

8

public class MainActivity extends Activity {

@Override

public void onCreate ( Bundle savedInstanceState ) {

super . onCreate ( savedInstanceState );

setContentView (R. layout . main );

Button viewSiteButton = ( Button ) findViewById (R.id. view_site_button );

Button sendEmailButton = ( Button ) findViewById (R.id. send_email_button );

Button makeCallButton = ( Button ) findViewById (R.id. make_call_button );

viewSiteButton . setOnClickListener ( new OnClickListener () {

@Override

public void onClick ( View v) {

Intent intent = new Intent ( Intent . ACTION_VIEW , Uri

. parse ("http://ufu.br"));

startActivity ( intent );

}

});

Page 9: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Exemplo

9

sendEmailButton.setOnClickListener ( new OnClickListener () {

@Override

public void onClick ( View v) {

Intent intent = new Intent ( Intent . ACTION_SEND );

intent . setType (" plain / text ");

intent . putExtra ( Intent . EXTRA_EMAIL,

new String [] { "[email protected]" });

startActivity ( Intent . createChooser ( intent , " Enviar email "));

}

});

makeCallButton . setOnClickListener ( new OnClickListener () {

@Override

public void onClick ( View v) {

Intent intent = new Intent ( Intent . ACTION_DIAL , Uri

. parse (" tel :3827-3000"));

startActivity ( intent );

}

});

} } • adicione a permissão para fazer ligações no Android

<uses-permission android:name =" android.permission.CALL_PHONE " />

Page 10: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Ações de Intent úteis

Lembra das ações “nativas” do Android?

10

Action URI - chamar Uri.parse(uri) Descrição

ACTION_VIEW http://www.gmail.com Abre browser na página

ACTION_VIEW

ACTION_EDIT content://com.android.contacts/contacts/1

Mostra ou edita o contato

solicitado

ACTION_VIEW geo:0,0?q=Presidente+Vargas,Rio+de+Janeiro Busca no Google Maps

ACTION_CALL

ACTION_DIAL tel:12345678 Liga ou apenas disca para o número

ACTION_INSERT content://com.android.contacts/contacts Abre activity padrão para inserir

contatos

ACTION_PICK ContactsContract.Contacts.CONTENT_URI Abre lista de contatos do celular

ACTION_SET_WALLPAPER - Abre lista para escolha de papéis

de parede

Page 11: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Ações de Intent Crie um novo projeto chamado IntentFilterTest

Experimente chamar activities usando a tabela anterior

Exemplo: Uri uri = Uri.parse("content://com.android.contacts/contacts");

Intent intent = new Intent(Intent.ACTION_INSERT, uri);

startActivity(intent);

intent = new Intent(Intent.ACTION_SET_WALLPAPER);

startActivity(intent);

Experimente também: Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);

intent.putExtra(SearchManager.QUERY, "Maria");

startActivity(intent);

Sim, você pode passar parâmetros via Intent, dependendo de qual ação está sendo

executada! 11

Page 12: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Ações de Intent ACTION_CALL não irá funcionar pois é necessário pedir permissão através do

AndroidManifest.xml

Adicione esta permissão e tente novamente

<uses-permission android:name="android.permission.CALL_PHONE”/>

Outras permissões úteis android.permission.READ_CONTACTS android.permission.VIBRATE android.permission.INTERNET android.permission.BATTERY_STATS android.permission.BLUETOOTH android.permission.CAMERA android.permission.REBOOT android.permission.SEND_SMS

Além disso, para usar o Google Maps é necessário rodar o emulador com Google Maps.

12

Page 13: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Categorias e parâmetros para Intent

Algumas vezes Ação e URI não são suficientes

É possível adicionar tantas categorias e parâmetros extras quanto forem necessários, além de outros dados:

Os métodos setData() e setType() são antagônicos, ou seja,

chamar um deles implica em limpar o outro.

13

Método da Intent Descrição

addCategory(String) Adiciona mais uma categoria à Intent

putExtra(String, ...) Adiciona um parâmetro à Intent

setData(Uri) Define o Uri. Equivalente ao parâmetro URI do construtor

setType(String) Define o tipo MIME: text/plain, image/jpeg, etc

setFlags(int)

addFlags(int)

Define os flags da Intent. Um flag útil é o FLAG_ACTIVITY_NEW_TASK, que faz a activity

iniciar numa nova tarefa

setAction(String) Define a ação desta intent. Note que, diferentemente de categorias e extras, apenas

uma ação pode ser definida por intent.

Page 14: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Substituindo ações nativas Tecla Home

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.HOME"/>

<category android:name="android.intent.category.DEFAULT" />

</intent-filter>

Tecla discar (call) <action android:name="android.intent.action.CALL_BUTTON" />

<category android:name="android.intent.category.DEFAULT" />

Intent.ACTION_SEARCH <action android:name="android.intent.action.SEARCH" />

<category android:name="android.intent.category.DEFAULT" />

Intent.ACTION_WEB_SEARCH <action android:name="android.intent.action.WEB_SEARCH" />

<category android:name="android.intent.category.DEFAULT" />

14

Page 15: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Ações nativas

Crie um projeto IntentFilterNativeSubst

Modifique o manifest e rode a aplicação para cada exemplo do slide anterior

Após o último exemplo (web search) edite o projeto IntentFilterTest para chamar web search: intent = new Intent(Intent.ACTION_WEB_SEARCH);

intent.putExtra(SearchManager.QUERY, "Maria");

startActivity(intent);

Execute IntentFilterTest

Veja que o emulador irá perguntar qual aplicação executar

15

Page 16: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Ações e categorias próprias e filtragem

Para criar as próprias ações e categorias, faça:

Configurá-las no manifest usando <intent-filter>

Criar a Intent e executá-la

Isto pode ser feito na mesma aplicação ou não

Filtragem

Ao executar uma Intent, uma activity só rodará caso seu intent-filter satisfaça a

ação e todas as categorais definidas na Intent.

Exemplos:

Considere intent-filter: ACAO1, CATEG1, CATEG2

1. Intent: ACAO1, CATEG1 Executa

2. Intent: ACAO1, CATEG1, CATEG2 Executa

3. Intent: ACAO1, CATEG3 Não executa! 16

Page 17: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Ações próprias e filtragem – Exercício

No manifest de IntentFilterNativeSubst <action android:name="com.example.intentfilter.nativesubst.ACTION" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="com.example.intentfilter.nativesubst.CATEG1" /> <category android:name="com.example.intentfilter.nativesubst.CATEG2" />

Dê play na aplicação IntentFilterNativeSubst para instalá-la, note que nada rodará na tela, pois não há MAIN e LAUNCHER

Em IntentFilterTest intent = new Intent("com.example.intentfilter.nativesubst.ACTION"); intent.addCategory("com.example.intentfilter.nativesubst.CATEG1"); intent.addCategory("com.example.intentfilter.nativesubst.CATEG2"); startActivity(intent);

Rode IntentFilterTest e IntentFilterNativeSubst rodará

Remova CATEG2 do manifest e repita a operação...

17

Page 18: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Intent filter e permissões Caso um <intent-filter> não seja definido para uma activity

apenas a própria aplicação poderá iniciá-la

Mas é possível exportá-la

<activity ... android:exported=“true” > ...

Mesmo assim, é necessário que a aplicação que queira iniciá-la use Intent.setComponentName() ou setClassName() e conheça o nome da classe completo

Exemplo: “com.example.application.ActivityName”

O uso de <intent-filter> no manifest exporta a activity automaticamente

Usar setClassName() ou setComponentName() para iniciar uma activity não exportada lançará uma SecurityException

18

Page 19: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Intent filter e permissões

É possível criar sua própria permissão <manifest ... > <permission android:label="@string/..." android:name="application_package.PERMISSION_NAME" /> <application ... > <activity ... android:exported="true" android:permission="application_package.PERMISSION_NAME" > </activity> </application> </manifest>

Se uma aplicação diferente quiser acessar esta activity será necessário usar um elemento <uses-permission> para a permissão definida pela aplicação <uses-permission android:name="application_package.PERMISSION_NAME"/>

19

Page 20: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Widgets

Page 21: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

EditText Recuperando o valor de Um EditText

Monitorando um controle EditText para Ações

usuário clica no controle

setOnClickListener()

usuário usa um click longo no controle

setOnKeyListener()

usuário muda o foco do controle

setOnFocusChangedListener()

usuário muda o foco para ou a partir do controle

setOnFocusChangedListener()

21

EditText simpleEditText = (EditText)findViewById(R.id.editTextSimple);

String strValue = simpleEditText.getText().toString();

simpleEditText.setOnFocusChangeListener(new OnFocusChangeListener()

{

public void onFocusChange(View v, boolean hasFocus) {

String strValue = simpleEditText.getText().toString();

Log.d(DEBUG_TAG, "User set EditText value to " + strValue);

}

});

Page 22: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

EditText

Diferentes tipos de entrada

android:inputType="phone“

android:inputType="textPassword“

Definir Sugestões (Hints) e valores dos EditText

android:hint="@string/hint"

22

none text textCapCharacters textCapWords textCapSentences textAutoCorrect textAutoComplete textMultiLine textImeMultiLine textNoSuggestions textUri

textEmailAddress textEmailSubject textShortMessage textLongMessage textPersonName textPostalAddress textPassword textVisiblePassword textWebEditText textFilter textPhonetic

textWebEmailAddress textWebPassword number numberSigned numberDecimal numberPassword phone datetime date tim

Page 23: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

EditText

Facilitar entrada textual (atributos extras)

Tornar maiúscula a cada frase, palavra ou caractere

android:capitalize="sentences“

Limitar a zeros e uns

android:digits="01“

Desabilitar o cursor

android:cursorVisible="false"

23

Page 24: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Máscara para seu EditText

Utilize o evento provocado quando altera

o conteúdo do componente

onTextChanged (CharSequence s, int start, int

before, int count)

Adicione um listener a seu componente

addTextChangedListener(TextWatcher x)

24

Page 25: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Máscara de Fone (xx) xxxx-xxxx

25

private void setPhoneTextWatcher(final EditText et) {

et.addTextChangedListener(new TextWatcher() { private boolean editando = false; private String fone; private int tamVelho = 0; @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // COLOCA A MÁSCARA }

@Override public void afterTextChanged(Editable arg0) { } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { }

} ); } etCEP = (EditText) findViewById(R.id.et_cep); setCEPTextWatcher(etCEP);

Page 26: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Código do OnTextChanged()

26

public void onTextChanged(CharSequence s, int start, int before, int count) { if (!editando) { editando = !editando; String text = et.getText().toString(); fone = text.replaceAll("\\(", "").replaceAll("\\)", "").replaceAll("-", "").replaceAll(" ", ""); if (fone.length() >= 2 && fone.length() > tamVelho) {

String parte0 = fone.substring(0, 2); String parte1 = fone.substring(2); String parte2 = ""; if (fone.length() < 6) {

tamVelho = fone.length(); fone = "(" + parte0 + ") " + parte1;

} else { parte1 = fone.substring(2, 6); parte2 = fone.substring(6); tamVelho = fone.length(); fone = "(" + parte0 + ") " + parte1 + "-" + parte2;

} } else {

tamVelho = fone.length(); fone = text;

} if (fone.length() > 2) {

et.setTextKeepState(fone, BufferType.EDITABLE); et.setSelection(fone.length());

} editando = !editando; }

}

Page 27: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Button e ImageButton Permitem criar botões clicáveis na tela

Button - subclasse de TextView

ImageButton - subclasse de ImageView

27

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/button_text"

... /> <ImageButton

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/button_icon"

... />

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/button_text"

android:drawableLeft="@drawable/button_icon"

... />

Page 28: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Button e ImageButton Permitem criar botões clicáveis na tela

Button - subclasse de TextView

ImageButton - subclasse de ImageView

Setando imagem via Java e XML

imageButton.setImageResource(R.drawable.image_id)

button.setCompoundDrawablesWithIntrinsicBounds(left,top,right,bottom)

<ImageButton android:src="@drawable/..." ... />

<Button android:drawableLeft="@drawable/..."

android:drawableTop="..."

android:drawableRight="..." android:drawableBottom="..." ... />

Detectando clique: final Button button = (Button) findViewById(R.id.button_id);

button.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

// Perform action on click

}

});

28

Page 29: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Ou pode detectar o Click assim

Usando implementação anônima

29

// Create an anonymous implementation of OnClickListener

private OnClickListener myListener = new OnClickListener() {

public void onClick(View v) {

// do something when the button is clicked

}

};

protected void onCreate(Bundle savedValues) {

...

// Capture our button from layout

Button button = (Button)findViewById(R.id.button1);

// Register the onClick listener with the implementation above

button.setOnClickListener(myListener);

...

}

Page 30: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Ou como Listener da Activity

Coloque a Activity com listener de eventos:

Crie o método onClick

Informe que a classe é o listener do botão

30

public class MainActivity extends Activity implements OnClickListener {

public void onClick(View v) {

switch (v.getId()) {

case R.id.bStart1:

.....

break;

case R.id.bStart2:

....

break;

case R.id.bSair:

finish();

} }

bStart1.setOnClickListener(this);

bStart2.setOnClickListener(this);

bSair.setOnClickListener(this);

Page 31: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Ou então no XML

Informe no layout o evento do botão

Crie o método onClick

elimina a necessidade de quase todo o código adicionado

criação da variável Button,

armazenando a referência

implementando OnClickListener e

definir a classe como OnCLickListener.

31

android:onClick="buttonClicked"

public void buttonClicked(View v) {

Button theButton = (Button)v;

theButton.setText(“WOW”);

}

Page 32: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem

Exercícios

Fazer uma aplicativo para calcular o IMC.

Obtem peso e altura em uma interface e

mostra o resultado em outra.

Coloque um gif ilustrando o resultado...

Page 33: Intents - FACOM | Faculdade de Computaçãobacala/ANDROID/3 - Intents.pdf · Criação de filtros que determinam quais Intents devem ser executadas para cada mensagem