Navegar entre atividades usando Intents
Saltar da atividade principal para outra atividade
Usar uma Intent explícita.
Vamos adicionar uma atividade vazia e dar-lhe o nome de AddCourseActivity, marcando a opção para gerar o ficheiro de layout.
Contudo, não marques a opção Launcher Activity.
Intent
Uma Intent é uma forma importante de interação entre os vários componentes de uma aplicação Android.
Ela não só pode indicar a ação que o componente atual quer executar, como também permite passar dados entre diferentes componentes.
As Intents dividem-se em: Intent explícita e Intent implícita
Tem vários construtores.
No botão da atividade principal, vou instanciar uma Intent para saltar da atividade principal para a segunda atividade.
// [pt] Primeiro inicializar uma Intent, indicando de onde para onde vai
Intent it = new Intent(FirstActivity.this, AddCourseActivity.class);
startActivity(it);Code language: JavaScript (javascript)
Utilizar Intents implícitas
Em comparação com as Intents explícitas, as Intents implícitas não precisam de indicar explicitamente qual a atividade a iniciar. Em vez disso, especificam uma série de ações e categorias mais abstratas.
Depois, o sistema analisa esta Intent e ajuda-nos a encontrar uma atividade válida para iniciar.
Vamos modificar o AndroidManifest.xml.
Adicionar ação e categoria à segunda atividade.
Na ação, indicamos que esta atividade pode responder a esta ação específica.
<activity android:name=".AddCourseActivity">
<intent-filter>
<action android:name="com.foxdevelop.www.activitydemo.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>Code language: HTML, XML (xml)
Só quando a Intent conseguir corresponder à ação e categoria da atividade, é que esta poderá responder à Intent.
// [pt] Primeiro inicializar uma Intent para corresponder à ação definida no AndroidManifest.xml
Intent it = new Intent("com.foxdevelop.www.activitydemo.ACTION_START");
startActivity(it);Code language: JavaScript (javascript)
Por que não precisamos de corresponder à categoria?
Porque esta atividade está a usar a categoria android.intent.category.DEFAULT.
Esta é a categoria por defeito.
Quando chamamos o startActivity, a categoria DEFAULT é passada automaticamente.
Cada Intent só pode especificar uma ação, mas pode ter várias categorias.
Como estamos a usar a DEFAULT, não precisamos de a adicionar manualmente.
Se precisarmos de adicionar outras categorias:
// [pt] Primeiro inicializar uma Intent para corresponder à ação e adicionar categorias
Intent it = new Intent("com.foxdevelop.www.activitydemo.ACTION_START");
it.addCategory("com.foxdevelop.www.activitydemo.MY_CATEGORY");
it.addCategory("com.foxdevelop.www.activitydemo.MY_CATEGORY1111111");
startActivity(it);Code language: JavaScript (javascript)
Ao clicar no menu “Adicionar Curso”, verificámos que a aplicação crashou.
O motivo é que adicionámos uma categoria à intent, mas a segunda atividade não a tinha definida.
Por isso, precisamos de adicionar essa categoria.
<activity android:name=".AddCourseActivity">
<intent-filter>
<action android:name="com.foxdevelop.www.activitydemo.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.foxdevelop.www.activitydemo.MY_CATEGORY" />
</intent-filter>
</activity>Code language: HTML, XML (xml)
Nota:
Se a intent tiver várias categorias, não basta que uma corresponda; todas as categorias têm de ser correspondidas.
<activity android:name=".AddCourseActivity">
<intent-filter>
<action android:name="com.foxdevelop.www.activitydemo.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.foxdevelop.www.activitydemo.MY_CATEGORY" />
</intent-filter>
</activity>Code language: HTML, XML (xml)
case R.id.add:
// [pt] Primeiro inicializar uma Intent para corresponder à ação e adicionar categorias
Intent it = new Intent("com.foxdevelop.www.activitydemo.ACTION_START");
it.addCategory("com.foxdevelop.www.activitydemo.MY_CATEGORY2222222");
//it.addCategory("android.intent.category.DEFAULT");
startActivity(it);
break;Code language: JavaScript (javascript)
Abrir uma página web com uma Intent implícita
As Intents implícitas permitem fazer muito mais do que isto.
Não servem apenas para iniciar atividades dentro da mesma aplicação, mas também atividades de outras aplicações.
Isto torna possível a partilha de funcionalidades entre várias aplicações.
Por exemplo, no chat do WeChat, quando um amigo te envia um endereço, podes abri-lo com o navegador QQ.
Vamos experimentar agora:
Intent it = new Intent(Intent.ACTION_VIEW); // [pt] Ação incorporada no sistema
it.setData(Uri.parse("http://www.foxdevelop.com")); // [pt] Abrir um endereço web
startActivity(it);Code language: JavaScript (javascript)
O “http://” não pode faltar, caso contrário dá erro.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.foxdevelop.www.activitydemo, PID: 8917
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=www.foxdevelop.com }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1809)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1523)
at android.app.Activity.startActivityForResult(Activity.java:4224)
at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:68)Code language: PHP (php)
Fazer uma chamada com Intent implícita
Podes usar o protocolo tel para fazer chamadas
Na aula anterior usámos o protocolo http para abrir um domínio.
Por exemplo, vamos tentar ligar para o 10010.

Intent it = new Intent(Intent.ACTION_DIAL); // [pt] Ação incorporada no sistema
it.setData(Uri.parse("tel:10010")); // [pt] Ligar para este número; requer confirmação do utilizador
startActivity(it);Code language: JavaScript (javascript)
Passar dados entre atividades
As Intents podem passar dados
intent (substantivo): intenção, propósito; significado.
Usando o método putExtra, podes passar dados.
Depois, na segunda atividade, ao chamar o método getStringExtra, consegues obter os dados que foram passados.
Na segunda atividade, podes chamar o método getIntent para obter a Intent.
Claro que, se passares um número inteiro, podes usar o método getIntExtra para o obter.
Primeiro, na primeira atividade:
Intent it = new Intent(FirstActivity.this, AddCourseActivity.class);
it.putExtra("site", "www.foxdevelop.com");
it.putExtra("name", "FoxDevelop");
startActivity(it);Code language: JavaScript (javascript)
De seguida, na segunda atividade, obtém o objeto Intent e depois podes extrair os seus valores.
No método onCreate da segunda atividade:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_course_acticity);
Intent it = getIntent();
String site = it.getStringExtra("site");
String name = it.getStringExtra("name");
int version = it.getIntExtra("version", 1);
Log.e(TAG, site);
}Code language: JavaScript (javascript)
Devolver dados à atividade anterior
Quando saímos da atividade atual
Temos um método na atividade chamado startActivityForResult que pode devolver um resultado à atividade anterior antes de ser destruída.
Este método recebe dois parâmetros: o primeiro é a Intent e o segundo é o código de pedido, usado mais tarde no callback para determinar a origem dos dados.
Antes da atividade ser destruída, usando o método setResult, podes devolver um resultado à atividade anterior. Geralmente usa-se RESULT_OK ou RESULT_CANCELED. O segundo parâmetro é a Intent que transporta os dados.
Podemos usar o putExtra para definir valores na Intent.
Como na atividade anterior usámos o startActivityForResult para iniciar a segunda atividade, quando esta for destruída, vai acionar o método onActivityResult da primeira atividade. Aqui, podemos obter a Intent e o código de resultado.
Se o utilizador não clicar num botão para voltar atrás, mas usar a tecla “back”, neste caso precisamos de sobrescrever o método onBackPressed da segunda atividade.
1. Ao iniciar a Intent na primeira atividade
Intent it = new Intent(FirstActivity.this, AddCourseActivity.class);
it.putExtra("site", "www.foxdevelop.com");
it.putExtra("name", "FoxDevelop");
it.putExtra("version", 1);
startActivityForResult(it, 1);Code language: JavaScript (javascript)
2. Sobrescrever na primeira atividade
public class FirstActivity extends AppCompatActivity {
private static final String TAG = "FirstActivity";
// [pt] Sobrescrever o método da primeira atividade; quando a segunda atividade sair, este código será executado
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
String h = data.getStringExtra("hot");
Log.d(TAG, h);
}
super.onActivityResult(requestCode, resultCode, data);
}Code language: JavaScript (javascript)
3. Na segunda atividade
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_course_acticity);
// [pt] Obter os dados da atividade anterior
Intent it = getIntent();
String site = it.getStringExtra("site");
String name = it.getStringExtra("name");
int version = it.getIntExtra("version", 1);
Log.e(TAG, site);
// [pt] Adicionar evento de volta ao botão, atribuir valores à Intent no evento, definir o código de resultado e fechar
Button b = findViewById(R.id.button);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent it = getIntent();
it.putExtra("hot", "Cursos Populares");
setResult(RESULT_OK, it);
finish();
}
});
}Code language: JavaScript (javascript)
Quando voltamos à atividade principal, o evento é acionado e a mensagem de log é apresentada.
05-12 06:17:46.741 12960-12960/com.foxdevelop.www.activitydemo D/FirstActivity: Cursos Populares
Se quiseres que a tecla de saída também devolva dados
Precisas de sobrescrever o onBackPressed.
Vamos sobrescrever isto na segunda atividade:
// [pt] Este método é acionado quando premimos a tecla de saída (back)
@Override
public void onBackPressed() {
Intent it = getIntent();
it.putExtra("hot", "Últimos Cursos");
setResult(RESULT_OK, it);
finish();
}Code language: JavaScript (javascript)
05-12 06:23:08.654 13209-13209/com.foxdevelop.www.activitydemo D/FirstActivity: Cursos Populares
05-12 06:23:16.405 13209-13209/com.foxdevelop.www.activitydemo D/FirstActivity: Últimos Cursos
05-12 06:23:35.612 13209-13209/com.foxdevelop.www.activitydemo D/FirstActivity: Últimos Cursos
intent – passar dados entre atividades