Android: intenciones y filtros

Un androide Intentes una descripción abstracta de una operación a realizar. Se puede utilizar constartActivity para lanzar una actividad, broadcastIntent para enviarlo a cualquier componente de BroadcastReceiver interesado, y startService(Intent) o bindService(Intent, ServiceConnection, int) para comunicarse con un Servicio en segundo plano.

The intent itself, an Intent object, is a passive data structure holding an abstract description of an operation to be performed.

Por ejemplo, supongamos que tiene una actividad que necesita iniciar un cliente de correo electrónico y envía un correo electrónico usando su dispositivo Android. Para este propósito, su Actividad enviaría un ACTION_SEND junto con elchooser, a la resolución de intenciones de Android. El selector especificado proporciona la interfaz adecuada para que el usuario elija cómo enviar sus datos de correo electrónico.

Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
email.putExtra(Intent.EXTRA_EMAIL, recipients);
email.putExtra(Intent.EXTRA_SUBJECT, subject.getText().toString());
email.putExtra(Intent.EXTRA_TEXT, body.getText().toString());
startActivity(Intent.createChooser(email, "Choose an email client from..."));

La sintaxis anterior está llamando al método startActivity para iniciar una actividad de correo electrónico y el resultado debe ser como se muestra a continuación:

Por ejemplo, suponga que tiene una actividad que necesita abrir una URL en un navegador web en su dispositivo Android. Para este propósito, su Actividad enviará ACTION_WEB_SEARCH Intent al Intent Resolver de Android para abrir la URL dada en el navegador web. Intent Resolver analiza una lista de actividades y elige la que mejor se adapte a su intención, en este caso, la actividad del navegador web. Intent Resolver luego pasa su página web al navegador web e inicia la actividad del navegador web.

String q = "tutorialspoint";
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH );
intent.putExtra(SearchManager.QUERY, q);
startActivity(intent);

El ejemplo anterior buscará como tutorialspoint en el motor de búsqueda de Android y da el resultado de un punto de tutorial en su actividad

Existen mecanismos separados para entregar intenciones a cada tipo de componente: actividades, servicios y receptores de transmisión.

No Señor Método y descripción
1

Context.startActivity()

El objeto Intent se pasa a este método para iniciar una nueva actividad u obtener una actividad existente para hacer algo nuevo.

2

Context.startService()

El objeto Intent se pasa a este método para iniciar un servicio o entregar nuevas instrucciones a un servicio en curso.

3

Context.sendBroadcast()

El objeto Intent se pasa a este método para entregar el mensaje a todos los receptores de difusión interesados.

Objetos de intención

Un objeto Intent es un conjunto de información que utiliza el componente que recibe la intención, así como la información utilizada por el sistema Android.

Un objeto Intent puede contener los siguientes componentes en función de lo que comunica o va a realizar:

Acción

Esta es una parte obligatoria del objeto Intent y es una cadena que nombra la acción a realizar o, en el caso de las intenciones de difusión, la acción que tuvo lugar y se informa. La acción determina en gran medida cómo se estructura el resto del objeto de intención. La clase Intent define una serie de constantes de acción correspondientes a diferentes intenciones. Aquí hay una lista de acciones estándar de intención de Android

La acción en un objeto Intent se puede establecer con el método setAction () y leer con getAction ().

Datos

Agrega una especificación de datos a un filtro de intención. La especificación puede ser solo un tipo de datos (el atributo mimeType), solo un URI o tanto un tipo de datos como un URI. Un URI se especifica mediante atributos separados para cada una de sus partes:

Estos atributos que especifican el formato de URL son opcionales, pero también dependen mutuamente:

  • Si no se especifica un esquema para el filtro de intención, se ignoran todos los demás atributos de URI.
  • Si no se especifica un host para el filtro, se ignoran el atributo del puerto y todos los atributos de la ruta.

El método setData () especifica datos solo como un URI, setType () los especifica solo como un tipo MIME, y setDataAndType () los especifica como un URI y un tipo MIME. El URI es leído por getData () y el tipo por getType ().

Algunos ejemplos de pares de acción / datos son:

No Señor. Acción / Par de datos y descripción
1

ACTION_VIEW content://contacts/people/1

Muestra información sobre la persona cuyo identificador es "1".

2

ACTION_DIAL content://contacts/people/1

Muestre el marcador telefónico con la persona completada.

3

ACTION_VIEW tel:123

Muestre el marcador telefónico con el número indicado.

4

ACTION_DIAL tel:123

Muestre el marcador telefónico con el número indicado.

5

ACTION_EDIT content://contacts/people/1

Edite la información sobre la persona cuyo identificador es "1".

6

ACTION_VIEW content://contacts/people/

Muestra una lista de personas, por la que el usuario puede navegar.

7

ACTION_SET_WALLPAPER

Mostrar configuraciones para elegir fondo de pantalla

8

ACTION_SYNC

Va a ser sincrónico los datos, el valor constante es android.intent.action.SYNC

9

ACTION_SYSTEM_TUTORIAL

Comenzará el tutorial definido por la plataforma (tutorial predeterminado o tutorial de inicio)

10

ACTION_TIMEZONE_CHANGED

Da a entender cuando la zona horaria ha cambiado

11

ACTION_UNINSTALL_PACKAGE

Se utiliza para ejecutar el desinstalador predeterminado.

Categoría

La categoría es una parte opcional del objeto Intent y es una cadena que contiene información adicional sobre el tipo de componente que debe manejar la intención. El método addCategory () coloca una categoría en un objeto Intent, removeCategory () elimina una categoría previamente agregada y getCategories () obtiene el conjunto de todas las categorías actualmente en el objeto. Aquí hay una lista de categorías estándar de intención de Android .

Puede consultar los detalles de los filtros de intención en la siguiente sección para comprender cómo usamos las categorías para elegir la actividad apropiada correspondiente a una intención.

Extras

Esto estará en pares clave-valor para obtener información adicional que debe entregarse al componente que maneja la intención. Los extras se pueden configurar y leer utilizando los métodos putExtras () y getExtras () respectivamente. Aquí hay una lista de datos adicionales estándar de Android Intent

Banderas

Estas banderas son parte opcional del objeto Intent e indican al sistema Android cómo iniciar una actividad y cómo tratarla después de que se inicie, etc.

No Señor Banderas y descripción
1

FLAG_ACTIVITY_CLEAR_TASK

Si se establece en un Intent pasado a Context.startActivity (), esta marca hará que cualquier tarea existente que esté asociada con la actividad se borre antes de que se inicie la actividad. Es decir, la actividad se convierte en la nueva raíz de una tarea que de otro modo estaría vacía y todas las actividades anteriores se terminan. Esto solo se puede usar junto con FLAG_ACTIVITY_NEW_TASK.

2

FLAG_ACTIVITY_CLEAR_TOP

Si se establece, y la actividad que se está iniciando ya se está ejecutando en la tarea actual, entonces, en lugar de lanzar una nueva instancia de esa actividad, todas las demás actividades encima de ella se cerrarán y este Intent se entregará a arriba) la actividad anterior como una nueva intención.

3

FLAG_ACTIVITY_NEW_TASK

Esta bandera es utilizada generalmente por actividades que quieren presentar un comportamiento de estilo "lanzador": le dan al usuario una lista de cosas separadas que se pueden hacer, que de otra manera se ejecutan de forma completamente independiente de la actividad que las lanza.

Nombre del componente

Este campo opcional es un android ComponentNameobjeto que representa la clase Activity, Service o BroadcastReceiver. Si está configurado, el objeto Intent se entrega a una instancia de la clase designada; de lo contrario, Android usa otra información en el objeto Intent para localizar un objetivo adecuado.

El nombre del componente lo establece setComponent (), setClass () o setClassName () y lo lee getComponent ().

Tipos de intenciones

Hay dos tipos de intents compatibles con Android

Intenciones explícitas

La intención explícita va a estar conectada al mundo interno de la aplicación, supongamos que si desea conectar una actividad a otra actividad, podemos hacer esta cita con una intención explícita, la imagen de abajo conecta la primera actividad con la segunda actividad haciendo clic en el botón.

Estas intenciones designan el componente de destino por su nombre y generalmente se usan para mensajes internos de la aplicación, como una actividad que inicia un servicio subordinado o una actividad hermana. Por ejemplo

// Explicit Intent by specifying its class name
Intent i = new Intent(FirstActivity.this, SecondActivity.class);

// Starts TargetActivity
startActivity(i);

Intenciones implícitas

Estas intenciones no nombran un objetivo y el campo para el nombre del componente se deja en blanco. Las intenciones implícitas se utilizan a menudo para activar componentes en otras aplicaciones. Por ejemplo

Intent read1=new Intent();
read1.setAction(android.content.Intent.ACTION_VIEW);
read1.setData(ContactsContract.Contacts.CONTENT_URI);
startActivity(read1);

El código anterior dará el resultado que se muestra a continuación

El componente de destino que recibe la intención puede utilizar el getExtras()método para obtener los datos adicionales enviados por el componente de origen. Por ejemplo

// Get bundle object at appropriate place in your code
Bundle extras = getIntent().getExtras();

// Extract data using passed keys
String value1 = extras.getString("Key1");
String value2 = extras.getString("Key2");

Ejemplo

El siguiente ejemplo muestra la funcionalidad de un intento de Android para iniciar varias aplicaciones integradas de Android.

Paso Descripción
1 Utilizará Android Studio IDE para crear una aplicación de Android y nombrarla como Mi aplicación en un paquete com.example.saira_000.myapplication .
2 Modifique el archivo src / main / java / MainActivity.java y agregue el código para definir dos oyentes correspondientes a dos botones, es decir. Inicie el navegador y el teléfono de inicio.
3 Modifique el archivo XML de diseño res / layout / activity_main.xml para agregar tres botones en diseño lineal.
4 Ejecute la aplicación para iniciar el emulador de Android y verifique el resultado de los cambios realizados en la aplicación.

A continuación se muestra el contenido del archivo de actividad principal modificado src/com.example.My Application/MainActivity.java.

package com.example.saira_000.myapplication;

import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
   Button b1,b2;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      b1=(Button)findViewById(R.id.button);
      b1.setOnClickListener(new View.OnClickListener() {

         @Override
         public void onClick(View v) {
            Intent i = new Intent(android.content.Intent.ACTION_VIEW, 
               Uri.parse("http://www.example.com"));
            startActivity(i);
         }
      });

      b2=(Button)findViewById(R.id.button2);
      b2.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            Intent i = new Intent(android.content.Intent.ACTION_VIEW,
               Uri.parse("tel:9510300000"));
            startActivity(i);
         }
      });
   }
}

A continuación se mostrará el contenido de res/layout/activity_main.xml archivo -

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools" 
   android:layout_width="match_parent"
   android:layout_height="match_parent" 
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin" 
   tools:context=".MainActivity">
   
   <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Intent Example"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:textSize="30dp" />
      
   <TextView
      android:id="@+id/textView2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials point"
      android:textColor="#ff87ff09"
      android:textSize="30dp"
      android:layout_below="@+id/textView1"
      android:layout_centerHorizontal="true" />
      
   <ImageButton
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageButton"
      android:src="@drawable/abc"
      android:layout_below="@+id/textView2"
      android:layout_centerHorizontal="true" />
      
   <EditText
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/editText"
      android:layout_below="@+id/imageButton"
      android:layout_alignRight="@+id/imageButton"
      android:layout_alignEnd="@+id/imageButton" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Start Browser"
      android:id="@+id/button"
      android:layout_alignTop="@+id/editText"
      android:layout_alignRight="@+id/textView1"
      android:layout_alignEnd="@+id/textView1"
      android:layout_alignLeft="@+id/imageButton"
      android:layout_alignStart="@+id/imageButton" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Start Phone"
      android:id="@+id/button2"
      android:layout_below="@+id/button"
      android:layout_alignLeft="@+id/button"
      android:layout_alignStart="@+id/button"
      android:layout_alignRight="@+id/textView2"
      android:layout_alignEnd="@+id/textView2" />
</RelativeLayout>

A continuación se mostrará el contenido de res/values/strings.xml para definir dos nuevas constantes -

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <string name="app_name">My Applicaiton</string>
</resources>

A continuación se muestra el contenido predeterminado de AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.saira_000.myapplication">

   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:supportsRtl="true"
      android:theme="@style/AppTheme">
      <activity android:name=".MainActivity">
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   </application>
</manifest>

Intentemos ejecutar tu My Applicationsolicitud. Supongo que habías creado tuAVDmientras realiza la configuración del entorno. Para ejecutar la aplicación desde Android Studio, abra uno de los archivos de actividad de su proyecto y haga clic en el icono Ejecutar de la barra de herramientas. Android Studio instala la aplicación en su AVD y la inicia y si todo está bien con su configuración y aplicación, se mostrará el siguiente Emulador ventana -

Ahora haga clic en Start Browser , que iniciará un navegador configurado y mostrará http://www.example.com como se muestra a continuación:

De manera similar, puede iniciar la interfaz del teléfono usando el botón Iniciar teléfono, que le permitirá marcar el número de teléfono ya dado.

Filtros de intención

Has visto cómo se ha utilizado un Intent para llamar a otra actividad. El sistema operativo Android utiliza filtros para identificar el conjunto de actividades, servicios y receptores de difusión que pueden manejar la intención con la ayuda de un conjunto específico de acciones, categorías y esquemas de datos asociados con una intención. Usarás<intent-filter> elemento en el archivo de manifiesto para enumerar acciones, categorías y tipos de datos asociados con cualquier actividad, servicio o receptor de transmisión.

A continuación se muestra un ejemplo de una parte de AndroidManifest.xml archivo para especificar una actividad com.example.My Application.CustomActivity que puede ser invocado por cualquiera de las dos acciones mencionadas, una categoría y un dato -

<activity android:name=".CustomActivity"
   android:label="@string/app_name">
   
   <intent-filter>
      <action android:name="android.intent.action.VIEW" />
      <action android:name="com.example.My Application.LAUNCH" />
      <category android:name="android.intent.category.DEFAULT" />
      <data android:scheme="http" />
   </intent-filter>
   
</activity>

Una vez que esta actividad se define junto con los filtros mencionados anteriormente, otras actividades podrán invocar esta actividad utilizando el android.intent.action.VIEW, o usando el com.example.My Application.LAUNCH acción siempre que su categoría sea android.intent.category.DEFAULT.

los <data> El elemento especifica el tipo de datos que se espera que se llame a la actividad y, por ejemplo, nuestra actividad personalizada espera que los datos comiencen con "http: //"

Puede haber una situación en la que una intención pueda pasar por los filtros de más de una actividad o servicio, se le puede preguntar al usuario qué componente activar. Se genera una excepción si no se puede encontrar ningún objetivo.

Existen las siguientes comprobaciones de prueba de Android antes de invocar una actividad:

  • Un filtro <intent-filter> puede enumerar más de una acción como se muestra arriba, pero esta lista no puede estar vacía; un filtro debe contener al menos un elemento <action>, de lo contrario bloqueará todas las intenciones. Si se menciona más de una acción, Android intentará hacer coincidir una de las acciones mencionadas antes de invocar la actividad.

  • Un filtro <intent-filter> puede incluir cero, una o más de una categoría. si no se menciona ninguna categoría, Android siempre pasa esta prueba, pero si se menciona más de una categoría, para que la intención pase la prueba de categoría, todas las categorías del objeto Intent deben coincidir con una categoría del filtro.

  • Cada elemento <data> puede especificar un URI y un tipo de datos (tipo de medio MIME). Hay atributos separados comoscheme, host, porty pathpara cada parte del URI. Un objeto Intent que contiene tanto un URI como un tipo de datos pasa la parte del tipo de datos de la prueba solo si su tipo coincide con un tipo enumerado en el filtro.

Ejemplo

El siguiente ejemplo es una modificación del ejemplo anterior. Aquí veremos cómo Android resuelve el conflicto si una intención invoca dos actividades definidas en, a continuación, cómo invocar una actividad personalizada usando un filtro y la tercera es un caso de excepción si Android no presenta la actividad adecuada definida para una intención.

Paso Descripción
1 Utilizará android studio para crear una aplicación de Android y nombrarla como Mi aplicación en un paquete com.example.tutorialspoint7.myapplication; .
2 Modifique el archivo src / Main / Java / MainActivity.java y agregue el código para definir tres oyentes correspondientes a tres botones definidos en el archivo de diseño.
3 Agregue un nuevo archivo src / Main / Java / CustomActivity.java para tener una actividad personalizada que será invocada por diferentes intenciones.
4 Modifique el archivo XML de diseño res / layout / activity_main.xml para agregar tres botones en diseño lineal.
5 Agregue un archivo XML de diseño res / layout / custom_view.xml para agregar un <TextView> simple para mostrar los datos pasados ​​a través de la intención.
6 Modifique AndroidManifest.xml para agregar <intent-filter> a fin de definir reglas para su intención de invocar una actividad personalizada.
7 Ejecute la aplicación para iniciar el emulador de Android y verifique el resultado de los cambios realizados en la aplicación.

A continuación se muestra el contenido del archivo de actividad principal modificado src/MainActivity.java.

package com.example.tutorialspoint7.myapplication;

import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
   Button b1,b2,b3;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      b1=(Button)findViewById(R.id.button);
      b1.setOnClickListener(new View.OnClickListener() {
      
         @Override
         public void onClick(View v) {
            Intent i = new Intent(android.content.Intent.ACTION_VIEW,
               Uri.parse("http://www.example.com"));
            startActivity(i);
         }
      });

      b2 = (Button)findViewById(R.id.button2);
      b2.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            Intent i = new Intent("com.example.
               tutorialspoint7.myapplication.
                  LAUNCH",Uri.parse("http://www.example.com"));
            startActivity(i);
         }
      });

      b3 = (Button)findViewById(R.id.button3);
      b3.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            Intent i = new Intent("com.example.
               My Application.LAUNCH",
                  Uri.parse("https://www.example.com"));
            startActivity(i);
         }
      });
   }
}

A continuación se muestra el contenido del archivo de actividad principal modificado src/com.example.My Application/CustomActivity.java.

package com.example.tutorialspoint7.myapplication;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;

/**
 * Created by TutorialsPoint7 on 8/23/2016.
 */
public class CustomActivity extends Activity {
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.custom_view);
      TextView label = (TextView) findViewById(R.id.show_data);
      Uri url = getIntent().getData();
      label.setText(url.toString());
   }
}

A continuación se mostrará el contenido de res/layout/activity_main.xml archivo -

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   tools:context="com.example.tutorialspoint7.myapplication.MainActivity">

   <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Intent Example"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:textSize="30dp" />

   <TextView
      android:id="@+id/textView2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials point"
      android:textColor="#ff87ff09"
      android:textSize="30dp"
      android:layout_below="@+id/textView1"
      android:layout_centerHorizontal="true" />

   <ImageButton
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageButton"
      android:src="@drawable/abc"
      android:layout_below="@+id/textView2"
      android:layout_centerHorizontal="true" />

   <EditText
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/editText"
      android:layout_below="@+id/imageButton"
      android:layout_alignRight="@+id/imageButton"
      android:layout_alignEnd="@+id/imageButton" />

   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Start Browser"
      android:id="@+id/button"
      android:layout_alignTop="@+id/editText"
      android:layout_alignLeft="@+id/imageButton"
      android:layout_alignStart="@+id/imageButton"
      android:layout_alignEnd="@+id/imageButton" />

   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Start browsing with launch action"
      android:id="@+id/button2"
      android:layout_below="@+id/button"
      android:layout_alignLeft="@+id/button"
      android:layout_alignStart="@+id/button"
      android:layout_alignEnd="@+id/button" />
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Exceptional condition"
      android:id="@+id/button3"
      android:layout_below="@+id/button2"
      android:layout_alignLeft="@+id/button2"
      android:layout_alignStart="@+id/button2"
      android:layout_toStartOf="@+id/editText"
      android:layout_alignParentEnd="true" />
</RelativeLayout>

A continuación se mostrará el contenido de res/layout/custom_view.xml archivo -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical" android:layout_width="match_parent"
   android:layout_height="match_parent">
   <TextView android:id="@+id/show_data"
      android:layout_width="fill_parent"
      android:layout_height="400dp"/>
</LinearLayout>

A continuación se mostrará el contenido de res/values/strings.xml para definir dos nuevas constantes -

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <string name="app_name">My Application</string>
</resources>

A continuación se muestra el contenido predeterminado de AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.tutorialspoint7.myapplication">

   <application
      android:allowBackup = "true"
      android:icon = "@mipmap/ic_launcher"
      android:label = "@string/app_name"
      android:supportsRtl = "true"
      android:theme = "@style/AppTheme">
      <activity android:name = ".MainActivity">
         <intent-filter>
            <action android:name = "android.intent.action.MAIN" />
            <category android:name = "android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
      
      <activity android:name="com.example.tutorialspoint7.myapplication.CustomActivity">

         <intent-filter>
            <action android:name = "android.intent.action.VIEW" />
            <action android:name = "com.example.tutorialspoint7.myapplication.LAUNCH" />
            <category android:name = "android.intent.category.DEFAULT" />
            <data android:scheme = "http" />
         </intent-filter>

      </activity>
   </application>

</manifest>

Intentemos ejecutar tu My Applicationsolicitud. Supongo que habías creado tuAVDmientras realiza la configuración del entorno. Para ejecutar la aplicación desde Android Studio, abra uno de los archivos de actividad de su proyecto y haga clic en el icono Ejecutar en la barra de herramientas. Android Studio instala la aplicación en su AVD y la inicia y, si todo está bien con su configuración y aplicación, se mostrará la siguiente ventana del emulador:

Ahora comencemos con el primer botón "Iniciar navegador con acción VER". Aquí hemos definido nuestra actividad personalizada con un filtro "android.intent.action.VIEW", y ya hay una actividad predeterminada contra la acción VIEW definida por Android que está iniciando el navegador web, por lo que Android muestra las siguientes dos opciones para seleccionar la actividad que quiere lanzar.

Ahora, si selecciona Navegador, Android iniciará el navegador web y abrirá el sitio web example.com, pero si selecciona la opción IndentDemo, Android iniciará CustomActivity, que no hace más que capturar los datos pasados ​​y se muestra en una vista de texto de la siguiente manera:

Ahora regrese usando el botón Atrás y haga clic en el botón "Iniciar navegador con acción de INICIO", aquí Android aplica el filtro para elegir definir actividad y simplemente inicia su actividad personalizada

Nuevamente, regrese usando el botón Atrás y haga clic en el botón "Condición de excepción", aquí Android intenta encontrar un filtro válido para la intención dada pero no encuentra una actividad válida definida porque esta vez hemos usado datos como https en vez de http aunque estamos dando una acción correcta, por lo que Android genera una excepción y muestra la siguiente pantalla: