Успях да накарам своя BroadcastReceiver да работи с това:
<receiver
android:name=".AlarmReceiver"
android:enabled="true"
android:exported="false">
</receiver>
Както можете да видите не <intent-filter>
. Извиква се правилно с правилните Intent
екстри. Но се оглеждах и съм объркан дали имам нужда от такъв или не? Имам метод setAction()
, извикан на моите Intent
s, но за да ги направя уникални от другите, за да осигуря конкретен проблем с известията, а не всъщност да използвам низа на това действие. Но каква точно е корелацията? Благодаря предварително.
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>
? Съпоставям го с конкретен клас. Може да няма действително действие, което да ги свързва заедно, но достатъчно ли е класът?