Iniciando outras atividades Intent • INTENT = intenção? • É um objeto-mensageiro usado para solicitar uma ação e mandar dados para alguma outra atividade no Android. • 3 usos: – Iniciar uma outra Activity • pode ser do mesmo programa – Iniciar um Service – Mandar uma mensagem para “todos” (PendingIntent) (ServiceIntent) (BroadcastIntent) • Opcional: quem foi chamado pode mandar dados de volta Iniciando outra atividade do mesmo programa Intent intent = new Intent(estaActivity.this, outraActivity.class); Intent.putExtra(“chave1”, “valor1”); Intent.putExtra(“chave2”, “valor2”); … startActivity(intent); – Chaves e valores são dependentes da aplicação Quem recebe: Intent intent = getIntent(); String valor1 = Intent.getExtraString(“chave1”); String valor2 = Intent.getExtraString(“chave1”); Enviando diversos dados Quando há vários dados a enviar, e de vários tipos, pode-se criar e enviar um Bundle. Bundle pacote = new Bundle(); pacote.putExtra(“dado1”, “valor1”) pacote.putExtra(“dado2”, “valor2”) intent.putExtras (pacote); startActivity (intent); Quem recebe: Bundle pacote = intent.getExtras(); dado1 = pacote.getString(“dado1”); Mandando dados, esperando volta Quem chama: Intent intent = new Intent(......); intent.putExtra(.....); startActivityForResult (intent, REQUEST_CODE); código inventado por você Quem foi chamado, opera como anteriormente... Mas ao terminar tem que chamar o método finish(), que é implementado assim: @Override public void finish() { Intent dados = new Intent(); dados.putExtra(“valor1a", “xxxyyyzzz"); // pode haver vários valores... setResult(RESULT_OK, dados); super.finish(); } ...... Continua ...... >>>>>> Recebendo o retorno • Quem chamou originalmente tem que implementar onActivityResult @Override protected void onActivityResult(int reqCode, int resultCode, Intent data) { if (resultCode == RESULT_OK && reqCode == REQUEST_CODE) { if (data.hasExtra("returnKey1")) { Toast.makeText(this, data.getExtras().getString("returnKey1"), Toast.LENGTH_SHORT).show(); } } Intents implícitos • Um aplicativo pode definir o componente de destino diretamente na intenção (intento explícito) ou pedir o sistema Android para avaliar componentes registrados com base nos dados de intenção (Intenções implícitas). • Por exemplo: executa um intent dirigido a “sei lá que aplicação que saiba tirar fotos” • Android define várias categorias pré-definidas, e para cada uma delas, as formas de bundles que podem ser enviados. • Muitas vezes o bundle pode ser obtido pelo “parsing” de uma URI. – por exemplo, um site ou um e-mail. Por este bundle, o sistema consegue determinar a aplicação. String url = "http://intervox.nce.ufrj.br"; Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(url)); startActivity(i); Outro exemplo: telefonar Intent it = new Intent(Intent.ACTION_DIAL); Uri = Uri.parse(“tel:25983339”)); it.setData (Uri); startActivity(it); Isso é também chamado de Late Runtime Binding • significa que o Android em tempo de execução resolver a classe que irá executar a ação, pode ser classe diferente aprofundado sobre o tipo de dados especificados Outro exemplo: enviar email Usando chooser String uriText = "mailto:[email protected]" + "?subject=" + URLEncoder.encode("some subject text here") + "&body=" + URLEncoder.encode("some text here"); Uri uri = Uri.parse(uriText); Intent it = new Intent(Intent.ACTION_SENDTO); it.setData(uri); startActivity(Intent.createChooser(it, "Send email")); Sua aplicação pode ser usada pelas outras aplicações • Intent Filters: informação no Manifest indicando que a Activity consegue atender a certos pedidos. <activity android:name=“MainActivity“> ... <intent-filter> <action android:name=“fotosEspeciais"/> <category android:name="android.intent.category.DEFAULT" /> <data …. /> </intent-filter> </activity> Se algum intent pedir por “fotosEspeciais”, seu aplicativo “será aberto”.