Код для запуска внешнего приложения явно
Из одного из моих приложений я пытаюсь запустить другой. Я хочу использовать явное намерение.
ComponentName cn = new ComponentName("com.myOtherApp", "OtherAppActivity");
Intent intent = new Intent();
intent.setComponent(cn);
context.startActivity(intent);
Когда я запускаю этот код, он спрашивает, объявила ли я эту активность в своем манифесте. Однако, когда я помещаю в манифест, я получаю ту же ошибку:
<activity android:name="com.myOtherApp.OtherAppActivity">
</activity>
Что я делаю неправильно?
Спасибо
Ответы
Ответ 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");