Запуск мероприятий из разных пакетов
У меня есть активность A в пакете 1, и я хочу запустить намерение, которое будет активировать действие B, которое находится в пакете 2.
Как я могу это сделать? Любые образцы будут приветствоваться.
это то, что я сделал, и ошибка, которую я получаю:
первая активность ( "MainActivity" ) в пакете: com.abelski.currencyclient
и второе действие ( "SecondActivity" в другом пакете: com.idan.second
теперь я хочу позвонить из MainActivity в SecondActivity.
ive добавила эту строку в манифест MainActivity:
<activity android:name="com.idan.second.SecondApplicationActivity"></activity>
теперь в главной операции. Я получил эту кнопку, которая запускает эту строку:
Intent intent = new Intent(MainActivity.this,SecondApplicationActivity.class);
и это rror:
04-29 09:20:59.197: ERROR/AndroidRuntime(399): Uncaught handler: thread main exiting due to uncaught exception
04-29 09:20:59.276: ERROR/AndroidRuntime(399): java.lang.NoClassDefFoundError: com.idan.second.SecondApplicationActivity
04-29 09:20:59.276: ERROR/AndroidRuntime(399):
Ответы
Ответ 1
Я предполагаю, что под "пакетами" вы подразумеваете приложения.
У нас есть:
- ApplicationA с FirstActivity
- ApplicationB с SecondActivity
Если в файле ApplicationB AndroidManifest.xml в объявлении SecondActivity вы добавляете фильтр намерений, например:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="applicationB.intent.action.Launch" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Вы можете создать намерение запустить этот SecondActivity из FirstActivity с помощью:
Intent intent = new Intent("applicationB.intent.action.Launch");
startActivity(intent);
Что все это значит:
- В SecondActivity есть фильтр для действия намерения "applicationB.intent.action.Launch"
- Когда вы создаете намерение с этим действием и вызываете "startActivity", система найдет действие (если оно есть), которое отвечает на него
Документация для этого: https://developer.android.com/reference/android/content/Intent.html
Ответ 2
У меня была та же проблема, и решение было еще одним уровнем в корне вашего имени пакета.
Если у вас есть два пакета "com.first..." и "com.second...", а манифест ссылается на "com.first". Затем вы можете реорганизовать оба пакета, чтобы повторно использовать первую часть. Например, "com.package.first" и "com.package.second". Затем ваш манифест должен быть также обновлен
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.package">
...
<activity android:name=".first.FirstPackageActivity" android:label="FirstPackageActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".second.SecondPackageActivity" android:label="SecondPackageActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
Ваш код Java может создать намерение и начать работу обычным способом:
Intent intent = new Intent(this,ActivityClassName.class);
startActivity(intent);
Ответ 3
Если пакет, который вы упомянули здесь, тот же, что и в приложении, я думаю, что ответ в вопросе Android: запуск активности для другого стороннего приложения проще. первый ответ на этот вопрос, вам не нужно вносить какие-либо изменения в ваше второе приложение.
Ответ 4
Используйте явные намерения:
Intent intent = new Intent(context,ClassName.class);
где ClassName из другого пакета.
Иногда вы не будете знать имя класса в таких случаях, вам придется полагаться на намерение, которое рекламирует целевой класс.