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

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

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

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

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

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

благодаря

Попробуй что-нибудь вроде этого …

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

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

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

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

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

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

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

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

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

Создайте намерение как действие. Просто добавьте к нему категорию пусковой установки :

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