Трябва ли Android BroadcastReceiver да има етикет Intent-Filter?

Успях да накарам своя BroadcastReceiver да работи с това:

<receiver
        android:name=".AlarmReceiver"
        android:enabled="true"
        android:exported="false">
</receiver>

Както можете да видите не <intent-filter>. Извиква се правилно с правилните Intent екстри. Но се оглеждах и съм объркан дали имам нужда от такъв или не? Имам метод setAction(), извикан на моите Intents, но за да ги направя уникални от другите, за да осигуря конкретен проблем с известията, а не всъщност да използвам низа на това действие. Но каква точно е корелацията? Благодаря предварително.

Intent intent = new Intent(this.getContext(), AlarmReceiver.class);
        intent.setAction("com.something"+System.currentTimeMillis());
        //... extras are here
        PendingIntent pi = PendingIntent.getBroadcast(this.getContext(), 123, intent, PendingIntent.FLAG_CANCEL_CURRENT|Intent.FILL_IN_DATA);
AlarmManager alarm = (AlarmManager)getContext().getSystemService(Activity.ALARM_SERVICE);
        alarm.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pi);

Използването на това с това, което имам във файла на манифеста, работи.

РЕДАКТИРАНЕ Намерих това в блога на Android Developers и там се казва следното:


Неявните намерения указват само „на какво“ трябва да съответстват, като използват действия, категории, данни, MIME типове и т.н. Точните компоненти, които те ще намерят, се определят само по време на изпълнение, от мениджъра на пакети, който ги съпоставя с текущите приложения.

Явните намерения указват едно изрично „на кого“ трябва да съответстват чрез ComponentName. Независимо какво друго има в Intent, то е свързано само с точното име на манифестния пакет и името на класа, както е дадено в неговото ComponentName.


Все още съм леко объркан от това обяснение, но изглежда е най-близо до това, което трябва да правя. Така че съм сигурен, че използвам имплицитно намерение. Въпросът е, добре ли е, че оставям <intent-filter>? Съпоставям го с конкретен клас. Може да няма действително действие, което да ги свързва заедно, но достатъчно ли е класът?


person Andy    schedule 18.07.2012    source източник


Отговори (2)


<intent-filter> се изисква, когато искате да стартирате вашия приемник, използвайки имплицитни намерения, ако винаги използвате изрични намерения, за да стартирате своя излъчващ приемник, тогава не са необходими филтри за намерения.

вижте тази публикация на SO.

person Eight    schedule 18.07.2012
comment
Благодаря много за този линк. Познавам човека добре тук, така че ще го попитам директно. - person Andy; 18.07.2012

Целият начин, по който работи приемникът за излъчване, включва използването на филтър за намерения за улавяне на конкретни намерения за излъчване, които се изпращат в рамките на системата. Така че, ако не дадете на получателя филтър за намерения, тогава НИЩО няма да бъде изпратено до него и неговият код никога няма да се изпълни.

Моля, прочетете документацията на Intent и научете как Intent позволява IPC.

Актуализация

Също така е възможно без никакви декларации да получава всички публични излъчвания и начинът, по който вашият код го обработва... е, че игнорира всички излъчвания, с изключение на тези, които го интересуват. Никога не съм правил такова изпълнение, защото следвам стандарта. Което означава да се декларира или като динамичен слушател (Programatic), или като статичен слушател (XML декларация), където динамичният слушател ще има своя филтър за намерения, зададен в кода.

person JoxTraex    schedule 18.07.2012
comment
Това наистина е странно, защото моята работи добре. Както казах, моят BroadcastReceiver получава всички екстри за намерение правилно. Но имам горното в моя манифестен файл. Тааааа, обикновено бих се доверил на думите на по-опитни хора, но в този случай изглежда, че това не е вярно. Някакви идеи защо? - person Andy; 18.07.2012
comment
Трябва просто да следвате стандарта, определен от Google, което казах, ако погледнете техния изходен код, тази идея се използва много пъти. Всъщност няма нужда да го поставяте под въпрос, всичко, което е... е IPC. - person JoxTraex; 18.07.2012
comment
Също така е възможно без никакви декларации да получава всички публични излъчвания и начинът, по който вашият код го обработва... е, че игнорира всички излъчвания, с изключение на тези, които го интересуват. Което води до това, че кодът изпълнява повече, отколкото трябва. - person JoxTraex; 18.07.2012
comment
Хм, това е интересно и много оценявам съвета. Имам един проблем. Трябва да настроя setAction() по този конкретен начин, ако не, тогава има проблем, който получавам при настройването на известия. Това означава, че действието трябва да бъде уникално... - person Andy; 18.07.2012
comment
Трябва да актуализирате публикацията си с вашите конкретни подробности за проблема. - person JoxTraex; 18.07.2012
comment
Току що разбрах още нещо. Как бих могъл да получавам публични излъчвания, когато имам android:exported зададено на false. Това по същество казва, че не мога да получавам нищо извън собственото си приложение. - person Andy; 18.07.2012