Lanzar una aplicación de Android desde el navegador

He analizado varias preguntas de Stack Overflow con títulos similares a los míos. Cada una es respondida, y el autor original parece satisfecho, pero cuando trato de replicar sus resultados, llego con las manos vacías. Obviamente estoy haciendo algo terriblemente mal, pero parece que no puedo entenderlo.

Para referencia, estas son las preguntas que he estado mirando:

Iniciar aplicación de Android personalizada desde el navegador de AndroidHaga un enlace en el navegador de Android Inicie mi aplicación La URL de devolución de llamada de Android Dev no funcionaFiltros de intención de Android: ¿Cómo se utiliza correctamente la categoría de intención que se puede navegar?

Finalmente, quiero usar esto para reiniciar mi aplicación una vez que el usuario haya realizado una solicitud de autenticación de OAuth. Sin embargo, mi aplicación real es demasiado grande para publicarla aquí. Para esta pregunta, he reunido una aplicación simple, para mostrarle lo que he hecho. Tengo dos actividades Esto se debe principalmente a que cada ejemplo que he visto usa una actividad que usa la acción VER. Preferiría usar la acción PRINCIPAL, pero he usado ambas aquí para mostrar que probé ambas.

AndroidManifest.xml (Original; ver la versión editada a continuación)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.example" android:versionCode="1" android:versionName="1.0-SNAPSHOT">
<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
    <activity android:name=".HelloAndroidActivity">
        <intent-filter>
            <data android:scheme="ex1"/>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <activity android:name=".CallbackActivity">
        <intent-filter>
            <data android:scheme="ex2"/>
            <action android:name="android.intent.action.VIEW"/>
        </intent-filter>
    </activity>
</application>

AndroidManifest.xml (Editado en respuesta al comentario)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.example" android:versionCode="1" android:versionName="1.0-SNAPSHOT">
<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
    <activity android:name=".HelloAndroidActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <activity android:name=".CallbackActivity">
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <category android:name="android.intent.category.BROWSABLE"/>
            <data android:host="www.this-so-does-not-exist.com" android:scheme="http" />
        </intent-filter>
    </activity>
</application>

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

HelloAndroidActivity.java

package org.example;

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

public class HelloAndroidActivity extends Activity {

    private TextView textView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView = (TextView) findViewById(R.id.textView);
    }

    @Override
    public void onResume() {
        super.onResume();
        Intent intent = getIntent();
        Uri data = intent.getData();
        if (data != null) {
            textView.setText("Hello Web!");
        }
    }

}

CallbackActivity.java

package org.example;

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

public class CallbackActivity extends Activity {

    private TextView textView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView = (TextView) findViewById(R.id.textView);
    }

    @Override
    public void onResume() {
        super.onResume();
        Intent intent = getIntent();
        Uri data = intent.getData();
        if (data != null) {
            textView.setText("Hello Web!");
        }
    }

}

Esto se construye felizmente. Luego, dentro del navegador, si ingreso ex1: // helloworld o ex2: // helloworld obtengo resultados diferentes dependiendo de cómo se haga. Si lo ingreso en la barra de direcciones, obtengo una búsqueda en Google de ex1: // helloworld. Si lo hago a través de una redirección, aparece "Página web no disponible". Si trato de comenzar la intención directamente con algo similar a:

    Intent intent = new Intent(Intent.ACTION_MAIN);
    ComponentName componentName = new ComponentName(
            "org.example",
            "org.example.HelloAndroidActivity");
    intent.setComponent(componentName);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setData(Uri.parse("ex1://helloworld"));
    intent.addCategory(Intent.CATEGORY_BROWSABLE);
    startActivity(intent);

Me sale el predeterminado "¡Hola, mi ejemplo!". No estoy seguro de lo que estoy haciendo incorrectamente. ¿Alguna idea?

Respuestas a la pregunta(2)

Su respuesta a la pregunta