2010-01-14 13 views
9

Ich habe eine Anwendung, die einen Alarm mit AlarmManager setzt, die eine andere Aktivität startet, wenn es ausgelöst wird. Der AlarmManager verwendet einen PendingIntent und erzeugt eine BroadcastReceiver-Klasse zum angegebenen Zeitpunkt. Ich frage mich, ob es irgendeinen Weg gibt, dass ich Argumente zu diesem BroadcastReceiver durch das Intent-Objekt übergeben kann, das in PendingIntent geht?Übergabe von Argumenten an einen BroadcastReceiver durch einen Intent in Android

Im Grunde, was ich möchte ist, etwas zu tun wie folgt aus:

Intent my_intent = new Intent(this, BroadcastService.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, my_intent, 0); 
my_intent.putExtra("arg1", arg1); 
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (1000), pendingIntent); 

und ich möchte in der Lage sein arg1 in der OnReceive (Context, Intent) -Methode des BroadcastReceiver abzurufen. Ich dachte, dass die lokale Variable my_intent der zweite Parameter wäre, der von PendingIntent an onReceive übergeben wird, aber das ist anscheinend nicht ganz richtig. Ist es möglich, Parameter zwischen einer Aktivität und einem BroadcastReceiver auf diese Weise zu übergeben (Intent.putExtra()) oder stattdessen einen ContentProvider zu verwenden?

Danke!

Iva

Antwort

1

Ich habe eine Anwendung, die einen Alarm mit Alarmmanager setzt, die eine andere Aktivität beginnt, wenn es losgeht.

Das ist schlechte Form. Popup-Aktivitäten unangemeldet nicht ohne einen guten Grund (z. B. ein ankommendes Telefonat). Was ist, wenn der Benutzer gerade dabei ist, etwas zu tun, wie TXT oder ein Spiel zu spielen oder zu versuchen, Nummern für ein Telefonmenü zu tippen?

Ist es möglich, Parameter zwischen einer Aktivität passieren und ein BroadcastReceiver auf diese Weise (mit Intent.putExtra())

Ja. Beachten Sie jedoch, dass Sie PendingIntent.FLAG_UPDATE_CURRENT verwenden möchten, wenn Sie Ihre PendingIntent erstellen, um sicherzustellen, dass alle neuen Extras, die Sie auf dem Intent bereitstellen, tatsächlich verwendet werden.

+0

Ah ja, ich habe falsch gesagt; Ich verwende den Alarm als eine Möglichkeit, um eine bestimmte Aktivität zu einem bestimmten Zeitpunkt aufzurufen, und wenn der Alarm ausgelöst wird, erstelle ich eine Benachrichtigung, die der Benutzer bei Bedarf ablegen kann und erst dann die Aktivität aufruft, damit ich mich nicht anmelde Störe nicht, was immer sie gerade tun. Danke für deine Antwort! – ivcheto

+0

Hmm, Hinzufügen der PendingIntent.FLAG_UPDATE_CURRENT als Flag beim Abrufen der PendingIntent scheint nichts zu ändern; Ich bekomme immer noch nicht die Extras von der Absicht in meiner ursprünglichen Aktivität zu der Absicht, die an die onReceive – ivcheto

+1

übergeben. Rufen Sie putExtra() vor dem Erstellen der PendingIntent? Ich weiß nicht, wann PendingIntent den Intent serialisiert, aber wenn es sofort ausgeführt wird, hätten PutExtra() - Aufrufe nach dem Erstellen des PendingIntents keine Wirkung. – CommonsWare

1

Ja, ich denke, es möglich ist, alle Daten der grundlegenden Java-Typ und Serializable/Parceable Typen in den Extras eines Intent um einen PendingIntent gewickelt passieren und dann rufen Sie die Intent-Instanz die bestanden mit onReceive des Rundfunkempfängers. Ihr Ansatz sieht in Ordnung für mich aus.

Was ist das Problem/Fehler, die Sie bekommen? Ist die Instanz "arg1" serialisierbar?

+0

Ich bekomme keinen Fehler; Ich bekomme einfach kein Bündel mit der Absicht, die an die onReceive (Context, Intent) Methode meines BroadcastReceivers übergeben wird; Ich gehe davon aus, dass die Absicht, die an meinen BroadcastReceiver übergeben wurde, dieselbe Absicht ist, die ich in meiner Aktivität erstelle (und aufweise). In diesem Fall ist jedes Argument, das ich übergeben möchte, serialisierbar. – ivcheto

+0

Können Sie uns Ihren Code zeigen, der putExtra (..) und getXXXExtra (..) hat? – Samuh

+1

Es stellt sich heraus, dass ich nur den putExtra (...) bevor der PendingIntent erstellt wird. Danke für Ihre Hilfe! – ivcheto

9

Ich hatte ein ähnliches Problem, aber ich war bereits die Intent zuerst bevölkern, bevor Sie es in einem PendingIntent wickeln. Aber die Antwort auf mein Problem war, wie oben erwähnt, dass ich das Flag PendingIntent.FLAG_UPDATE_CURRENT verwenden musste. Sobald ich die Flagge gesetzt habe, hat es funktioniert! Ich hoffe, das hilft anderen. -Jeff

+0

Ich hatte das gleiche Problem und die Flagge hat es total getan. Vielen Dank! – DanO

+0

Sie sind ein Lebensretter! –

5
int code=1; 
Intent i2 = new Intent(StartAlarm); 
i2.putExtra("_id",code); 

class test extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent arg1) { 
     int i=arg1.getIntExtra("_id",-1); 
    } 
} 
Verwandte Themen