Что такое фильтры намерений в Android?
В моем приложении для Android я хотел начать действие "B" из начальной активности "A". Я создал классы для обоих. Однако при использовании следующего кода для запуска B я получаю ошибку времени выполнения: application has stopped unexpectedly, try again
. Вот мой код:
Intent myIntent = new Intent(this, AddNewActivity.class);
startActivity(myIntent);
Когда я добавил новую запись в AndroidManifest.xml/manifest/application/activity/intent-filers
для действия B, тогда приложение работало.
У меня есть два вопроса:
- Когда в
AndroidManifest.xml
есть несколько записей активности, как андроид знает, с какой целью начать сначала?
- Я не мог понять фильтры намерения. Может кто-нибудь объяснить.
Вот мой частичный AndroidManifest.xml
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".ListAllActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".AddNewActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Ответы
Ответ 1
Когда есть несколько действий записи в AndroidManifest.xml, как знает андроид начать сначала?
Нет "первого". В вашем случае, с вашим манифестом, как показано, у вас будет две иконки в вашей пусковой установке. Независимо от того, что пользователь забирает, запускается.
Я не мог понять фильтры намерения. Может кто-нибудь объяснит.
Существует довольно много документации по этому вопросу. Пожалуйста, прочитайте это, а затем задайте более конкретные вопросы.
Кроме того, когда вы получаете сообщение "неожиданно остановилось приложение, попробуйте еще раз", используйте adb logcat
, DDMS или перспективу DDMS в Eclipse, чтобы проверить трассировку стека Java, связанную с ошибкой.
Ответ 2
Фильтр намерений - это выражение в файле манифеста приложения, в котором указывается тип намерений, которые компонент хотел бы получить.
Когда вы создаете неявное намерение, система Android находит соответствующий компонент для начала, сравнивая содержимое намерения с фильтрами намерений, объявленными в файле манифеста других приложений на устройстве. Если цель совпадает с фильтром намерения, система запускает этот компонент и доставляет ему объект Intent.
AndroidManifest.xml
<activity android:name=".HelloWorld"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="http" android:host="androidium.org"/>
</intent-filter>
</activity>
Запустить HelloWorld
Intent intent = new Intent (Intent.ACTION_VIEW, Uri.parse("http://androidium.org"));
startActivity(intent);
Ответ 3
Сначала измените xml, отметьте свое второе действие как DEFAULT
<activity android:name=".AddNewActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Теперь вы можете инициировать это действие с помощью метода StartActivity.
Ответ 4
Когда вы создаете неявное намерение, система Android находит соответствующий компонент для начала, сравнивая содержимое намерения с фильтрами намерений, объявленными в файле манифеста других приложений на устройстве. Если цель совпадает с целевым фильтром, система запускает этот компонент и доставляет ему объект Intent. Если несколько фильтров намерения совместимы, система отображает диалоговое окно, чтобы пользователь мог выбрать, какое приложение использовать.
Фильтр намерений - это выражение в файле манифеста приложения, в котором указывается тип намерений, которые компонент хотел бы получить. Например, объявив фильтр намерений для активности, вы позволяете другим приложениям напрямую запускать вашу деятельность с определенным намерением. Аналогично, если вы не объявляете какие-либо фильтры намерений для активности, тогда ее можно запустить только с явным намерением.
В соответствии с: Intents и Intent Filters
Ответ 5
Сохраните первый фильтр намерения с помощью клавиш MAIN
и LAUNCHER
и добавьте еще один как ANY_NAME
и DEFAULT
.
Ваш LAUNCHER
будет активностью A и DEFAULT
будет вашей деятельностью B.
Ответ 6
Не может быть двух Lancher AFAIK. Logcat - полезный инструмент для отладки и проверки состояния приложения/машины взади. он будет автоматически переключаться с одного действия на другой.
Ответ 7
Activity
, который вы должны обедать при открытии приложения, упоминает его как LAUNCHER в категории намерений, а в остальных действиях упоминается Default в категории намерений.
Например: - Существует 2 действия A и B
Действие A является LAUNCHER, поэтому сделайте его как LAUNCHER в категории целей, а B является дочерним для Activity A, поэтому сделайте его как DEFAULT.
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".ListAllActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".AddNewActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
Ответ 8
target filter - это выражение, которое присутствует в манифесте вашего приложения, которое указывает тип намерений, которые должен получить компонент.
Если у компонента нет фильтра намерений, он может получить явное намерение.
Если компонент с фильтром получает как неявное, так и явное намерение
Ответ 9
Если возможно, попробуйте это одно мгновенное решение:
Intent intent =new Intent(getApplicationBaseContext,second_Act.class);
StartActivity(intent);