Код для явного запуска внешнего приложения - PullRequest
22 голосов
/ 09 мая 2011

Из одного из моих приложений я пытаюсь запустить другое. Я хочу использовать явное намерение.

ComponentName cn = new ComponentName("com.myOtherApp", "OtherAppActivity");
Intent intent = new Intent();
intent.setComponent(cn);
context.startActivity(intent);

Однако, когда я запускаю этот код, он спрашивает, объявил ли я эту активность в своем манифесте. Однако, когда я помещаю следующее в манифест, я получаю ту же ошибку:

<activity android:name="com.myOtherApp.OtherAppActivity">
</activity>

Что я делаю не так?

Спасибо

Ответы [ 6 ]

25 голосов
/ 09 мая 2011

Попробуйте что-то вроде этого ...

В манифесте для «myOtherApp» используйте фильтр намерений для «OtherAppActivity» с намерением, специфичным для компании, например ...

<activity
    android:name=".OtherAppActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="com.mycompany.DO_SOMETHING" />
    </intent-filter>
</activity>

Затем в приложении «вызов» используйте ...

Intent intent = new Intent();
intent.setAction("com.mycompany.DO_SOMETHING");
context.startActivity(intent);
19 голосов
/ 03 января 2012

У меня была эта проблема, и я часами искал решение.Наконец нашел его: http://www.krvarma.com/2010/08/launching-external-applications-in-android. Эта ссылка показывает, как использовать менеджер пакетов для запуска любого приложения, для которого у вас есть просто имя пакета:

PackageManager pm = this.getPackageManager();

try
{
  Intent it = pm.getLaunchIntentForPackage(sName);

  if (null != it)
    this.startActivity(it);
}

catch (ActivityNotFoundException e)
{
}
17 голосов
/ 26 мая 2012

Вам необходимо указать полное имя класса во втором параметре нового ComponentName, например:

ComponentName cn = new ComponentName("com.myOtherApp", "com.myOtherApp.OtherAppActivity");

Я думаю, это потому, что имя пакета в манифесте и имя действия не обязательнодолжен иметь одинаковый путь к пакету, поэтому новый вызов ComponentName не подразумевает, что второму параметру имени класса предшествует первый параметр имени пакета.

0 голосов
/ 13 февраля 2016

Начиная с API23, вы можете использовать метод ComponentName.createRelative (String pkg, String cls) и делать:

ComponentName cn = new ComponentName(ComponentName.createRelative("com.myOtherApp", ".OtherAppActivity"));
Intent intent = new Intent();
intent.setComponent(cn);
context.startActivity(intent);

Таким образом, вы можете создать объект ComponentName, используяотносительный путь к классу.Следите за точкой в ​​начале пути класса.Необходимо указать, что метод должен рассматривать второй аргумент как относительный путь.Как уже упоминалось в @Sogger, конструктор ComponentName ограничивает параметр класса абсолютным путем.

Обратите внимание, что таким образом вы используете явные намерения и вам не нужно вставлять дополнительные фильтры намерений вцелевая деятельность.

0 голосов
/ 09 июля 2014

В дополнение к ответу @Sogger следует помнить, что если класс получателя - com.myOtherApp.receiver.OtherAppActivity, а пакет, упомянутый в AndroidManifest - com.myOtherApp, ваш код будет

ComponentName cn = new ComponentName("com.myOtherApp", "com.myOtherApp.receiver.OtherAppActivity");
0 голосов
/ 09 мая 2011

Создайте намерение как action.Main и добавьте в него категорию launcher :

Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...