Подтвердить что ты не робот

Код для запуска внешнего приложения явно

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

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

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

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

Что я делаю неправильно?

Спасибо

4b9b3361

Ответ 1

Попробуйте что-нибудь подобное...

В манифесте для "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);

Ответ 2

У меня была эта проблема, и мы искали часы, чтобы найти решение. Наконец нашел: 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)
{
}

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

С 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 ограничивает параметр класса абсолютным путем.

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

Ответ 6

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

Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");