Как программно создать/отключить фильтр намерений?

У меня есть три действия и три фильтра намерений для них в манифесте Android.

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        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=".firstActivity"
        android:theme="@style/AppTheme" 
        android:label="@string/first">
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="image/*" />
        </intent-filter>  
   </activity>
    <activity 
        android:name=".secondActivity"
        android:theme="@style/AppTheme" 
        android:label="@string/second">
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="image/*" />
        </intent-filter>  
   </activity>
   <activity 
        android:name=".thirdActivity"
        android:theme="@style/AppTheme" 
        android:label="@string/third">
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="image/*" />
        </intent-filter>  
   </activity ></application>

Как программно отключить фильтры намерений в зависимости от некоторых параметров? Или как я могу создать новые фильтры намерений в коде?

Спасибо.


person mamutido    schedule 03.01.2013    source источник


Ответы (4)


Вы не можете включать, отключать или создавать <intent-filter>s программно.

Однако в вашем случае у вас есть только один <intent-filter> для каждого компонента. В этом случае вы можете включать и отключать компонент программно с помощью PackageManager и setComponentEnabledSetting(). В вашем случае включение или отключение действия будет иметь тот же основной эффект, что и включение или отключение его <intent-filter>.

person CommonsWare    schedule 03.01.2013
comment
Как насчет IntentFilter.create и Context.registerResolver? developer.android.com/reference/android/content/ - person Jonathan Muller; 16.02.2015
comment
@Koren: метода registerResolver() не существует. Возможно, вы думаете о registerReceiver(). Это возможно для BroadcastReceivers, но ОП спрашивает о действиях. Кроме того, registerReceiver() работает только во время работы вашего процесса, тогда как <intent-filter> работает, даже когда ваш процесс не запущен. - person CommonsWare; 16.02.2015
comment
Да, я говорил о registerReceiver, извините - person Jonathan Muller; 16.02.2015
comment
Я только что попытался отключить действие через PackageManager, но фильтр намерений остается в силе. Есть еще предложения? - person Grisgram; 03.10.2016
comment
@Grisgram: То, что вы описываете, невозможно, по крайней мере, исходя из того, как я бы определил термины, которые вы использовали. Вы можете задать отдельный вопрос о переполнении стека, где вы предоставите минимально воспроизводимый пример и объясните, как вы определили что вы оба успешно отключили активность, и <intent-filter> остается в живых. - person CommonsWare; 03.10.2016
comment
Это работает - извиняюсь - это была моя собственная ошибка, и я прокомментировал здесь слишком быстро :) - извините. Все хорошо. Работает, как описано. - person Grisgram; 04.10.2016
comment
Если у вас есть более одного фильтра намерений для каждого действия, вы можете использовать псевдоним действия, чтобы отключить их по отдельности. Проверьте этот ответ: stackoverflow.com/a/10403074/1954655 - person aglour; 10.02.2017

Если в вашем действии было несколько intent-filter, вы можете отключить определенный intent-filter, создав activity-alias с intent-filter, которое вы хотите отключить, и отключить только псевдоним действия. См.: https://developer.android.com/guide/topics/manifest/activity-alias-element.html

person Piotr Zawadzki    schedule 27.09.2017

Фильтр намерений — это экземпляр класса IntentFilter. Однако, поскольку система Android должна знать о возможностях компонента, прежде чем она сможет запустить этот компонент, фильтры намерений обычно настраиваются не в коде Java, а в файле манифеста приложения (AndroidManifest.xml) в качестве элементов. (Единственным исключением могут быть фильтры для широковещательных приемников, которые регистрируются динамически путем вызова Context.registerReceiver(); они создаются непосредственно как объекты IntentFilter.)

источник: http://developer.android.com/guide/components/intents-filters.html

Также см. это: https://stackoverflow.com/a/10403074/832776

person Oleg Vaskevich    schedule 03.01.2013

Я сделал registerReciever и

registerReceiver(this.broadcastReceiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));

и отменить регистрацию BroadcastReciever

if (this.broadcastReceiver != null) {
        unregisterReceiver(this.broadcastReceiver);
    }
person Beatle Refractor    schedule 22.12.2020