Намерение <псевдоним-активности> завершается неудачей с ActivityNotFoundException

Я написал псевдоним Activity для Activity:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.company.htmlapp">

    <application
        android:name=".AppController">

        <activity
            android:name=".main.MainActivity" />

       <activity-alias
           android:name=".main.MainActivityAlias"
           android:targetActivity=".main.MainActivity">
    </application>

</manifest>

После этого ответа я пытаюсь запустить псевдоним активности:

void goToMainActivity(String server) {
    Intent i;
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        i = new Intent();
        String activityPackage = MainActivity.class.getPackage().getName();
        ComponentName componentName = new ComponentName(activityPackage, ".MainActivityAlias");
        i.setComponent(componentName);
    } else {
        i = new Intent(this, MainActivity.class);
    }

    i.putExtra( ... );
    startActivity(i);
}

Полученное имя от MainActivity.class.getPackage().getName() является com. company.htmlapp.main,

Но это терпит неудачу в строке startActivity(i) с ActivityNotFoundException:

android.content.ActivityNotFoundException: Unable to find explicit activity class 
   {com.company.htmlapp.main/.MainActivityAlias}; have you declared this 
   activity in your AndroidManifest.xml?

Редактировать:

Пробовал с ComponentName(ActivityPackage, ".main.MainActivityAlias"); Полученная ошибка одинакова с другим пакетом:

android.content.ActivityNotFoundException: Unable to find 
    explicit activity class {com.company.htmlapp.main/.main.MainActivityAlias}; 
    have you declared this activity in your AndroidManifest.xml?

1 ответ

Решение

Для <activity-alias> объявлено так:

<activity-alias
  android:name=".main.MainActivityAlias"
  android:targetActivity=".main.MainActivity">

ComponentName можно создать так:

ComponentName componentName = new ComponentName("com.company.htmlapp", "com.company.htmlapp.main.MainActivityAlias");

В моем случае я также мог бы сделать это динамически:

    try {
        PackageManager pm = getPackageManager();
        PackageInfo packageInfo = pm.getPackageInfo(this.getPackageName(), 0);

        ComponentName componentName = new ComponentName(packageInfo.packageName,
                MainActivity.class.getPackage().getName() + ".MainActivityAlias");
        i.setComponent(componentName);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
Другие вопросы по тегам