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

Intents

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

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

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

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

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

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

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

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 " />

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

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

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

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.

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

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

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

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

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

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

Widgets

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

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

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

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

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

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

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"
... />

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

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

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

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

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...
