Navegar entre actividades usando Intents
Saltar de la actividad principal a otra actividad
Usa un Intent explícito.
Agregamos una actividad vacía y la llamamos AddCourseActivity, marcando «Generate Layout File».
Pero no marques la opción Launcher Activity.
Intent
Un Intent es una forma importante de que los componentes de una app Android interactúen.
Puede indicar la acción que el componente actual desea realizar y también pasar datos entre componentes.
Los Intents se dividen en: Intent explícito e Intent implícito
Tiene varios constructores.
En un botón de la actividad principal, instancio un Intent para saltar de la actividad principal a la segunda actividad.
// Primero inicializar un Intent indicando de dónde a dónde
Intent it = new Intent(FirstActivity.this, AddCourseActivity.class);
startActivity(it);Lenguaje del código: JavaScript (javascript)
Uso de Intents implícitos
En comparación con los Intents explícitos, los Intents implícitos no necesitan indicar qué actividad iniciar. En su lugar, especifican una serie de acciones y categorías más abstractas.
Luego el sistema analiza este Intent y nos ayuda a encontrar una actividad válida para iniciar.
Modificamos AndroidManifest.xml.
Agrega una acción y una categoría a la segunda actividad.
Para la acción, indicamos que esta actividad puede responder a esta acción.
<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>Lenguaje del código: HTML, XML (xml)
Solo cuando el Intent coincide con la acción y la categoría de la actividad, esta podrá responder al Intent.
// Inicializar un Intent para que coincida con la acción correspondiente en AndroidManifest.xml
Intent it = new Intent("com.foxdevelop.www.activitydemo.ACTION_START");
startActivity(it);Lenguaje del código: JavaScript (javascript)
¿Por qué no necesitamos hacer coincidir la categoría?
Porque esta actividad usa android.intent.category.DEFAULT.
Este es el valor predeterminado.
Cuando llamamos a startActivity, DEFAULT se pasa automáticamente.
Cada Intent solo puede especificar una acción, pero puede tener varias categorías.
Como actualmente es DEFAULT, no necesitamos agregarlo.
Si necesitamos agregar otras categorías:
// Inicializar un Intent para coincidir con la acción y agregar categorías
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);Lenguaje del código: JavaScript (javascript)
Al hacer clic en el menú «Agregar curso», la aplicación falló.
La razón es que agregamos una categoría al intent, pero la segunda actividad no declara esta categoría.
Por lo tanto, necesitamos agregar esta categoría.
<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>Lenguaje del código: HTML, XML (xml)
Nota:
Si un intent tiene varias categorías, no significa que bastará con que coincida una; todas las categorías deben coincidir.
<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>Lenguaje del código: HTML, XML (xml)
case R.id.add:
// Inicializar un Intent para coincidir con la acción y agregar categorías
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;Lenguaje del código: JavaScript (javascript)
Abrir una página web con un Intent implícito
Los Intents implícitos pueden hacer mucho más que esto.
No solo pueden iniciar actividades dentro de la misma aplicación, sino también actividades de otras aplicaciones.
Esto hace posible compartir funcionalidades entre varias aplicaciones.
Por ejemplo, en un chat de WeChat, cuando un amigo te envía una dirección, puedes abrirla con el navegador QQ.
Probémoslo a continuación:
Intent it = new Intent(Intent.ACTION_VIEW); // Acción integrada del sistema
it.setData(Uri.parse("http://www.foxdevelop.com")); // Abrir una URL
startActivity(it);Lenguaje del código: JavaScript (javascript)
El «http://» no se puede omitir, de lo contrario se producirá un error.
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)Lenguaje del código: PHP (php)
Hacer llamadas con Intents implícitos
Puedes usar el protocolo tel para hacer llamadas
En la clase anterior usamos el protocolo http para abrir un dominio.
Por ejemplo, intentemos marcar al 10010.

Intent it = new Intent(Intent.ACTION_DIAL); // Acción integrada del sistema
it.setData(Uri.parse("tel:10010")); // Marcar este número; requiere confirmación del usuario
startActivity(it);Lenguaje del código: JavaScript (javascript)
Pasar datos entre actividades
Los Intents pueden pasar datos
intent (sustantivo): intención, propósito; sentido, significado.
Usa su método putExtra para pasar datos.
Luego, en la segunda actividad, puedes obtener los datos pasados llamando al método getStringExtra.
En la segunda actividad, puedes llamar a getIntent para obtener el Intent.
Por supuesto, si pasas un entero, puedes usar getIntExtra para obtenerlo.
Primero, en la primera actividad:
Intent it = new Intent(FirstActivity.this, AddCourseActivity.class);
it.putExtra("site", "www.foxdevelop.com");
it.putExtra("name", "FoxDevelop");
startActivity(it);Lenguaje del código: JavaScript (javascript)
Luego, en la segunda actividad, obtén el objeto Intent y recupera sus valores.
En el método onCreate de la segunda actividad:
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);
}Lenguaje del código: JavaScript (javascript)
Devolver datos a la actividad anterior
Cuando salimos de la actividad actual
Las actividades tienen un método startActivityForResult que puede devolver un resultado a la actividad anterior antes de ser destruida.
Este método recibe dos parámetros: el primero es el Intent y el segundo es el código de solicitud, que se usa más tarde en la devolución de llamada para determinar la fuente de los datos.
Antes de que se destruya la actividad, usa el método setResult para devolver un resultado a la actividad anterior. Generalmente se usa RESULT_OK o RESULT_CANCELED. El segundo parámetro es el Intent que lleva los datos.
Puedes usar putExtra para establecer valores en el Intent.
Como usamos startActivityForResult en la actividad anterior para iniciar la segunda actividad, cuando esta se destruya, se activará el método onActivityResult de la primera actividad. Aquí puedes obtener el Intent y el código de resultado.
Si el usuario no hace clic en un botón para volver atrás, sino que usa la tecla de retroceso, necesitamos sobrescribir el método onBackPressed de la segunda actividad.
1. Al iniciar el Intent en la primera actividad
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);Lenguaje del código: JavaScript (javascript)
2. Sobrescribir en la primera actividad
public class FirstActivity extends AppCompatActivity {
private static final String TAG = "FirstActivity";
// Sobrescribir el método de la primera actividad; cuando la segunda actividad sale, se ejecuta este código
@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);
}Lenguaje del código: JavaScript (javascript)
3. En la segunda actividad
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_course_acticity);
// Obtener datos de la actividad anterior
Intent it = getIntent();
String site = it.getStringExtra("site");
String name = it.getStringExtra("name");
int version = it.getIntExtra("version", 1);
Log.e(TAG, site);
// Agregar evento de retroceso al botón, establecer valores en el Intent dentro del evento, establecer código de resultado y finalizar
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();
}
});
}Lenguaje del código: JavaScript (javascript)
Cuando volvemos a la actividad principal, se activa el evento y se muestra el registro.
05-12 06:17:46.741 12960-12960/com.foxdevelop.www.activitydemo D/FirstActivity: Cursos populares
Si quieres que la tecla de retroceso también devuelva datos
Necesitas sobrescribir onBackPressed.
Sobrescribimos esto en la segunda actividad:
// Este método se activa cuando presionamos la tecla de retroceso
@Override
public void onBackPressed() {
Intent it = getIntent();
it.putExtra("hot", "Últimos cursos");
setResult(RESULT_OK, it);
finish();
}Lenguaje del código: 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