2010-01-14 19 views
9

AlarmManager'ı kullanarak alarmı ayarlayan bir uygulama var. AlarmManager bir PendingIntent alır ve belirtilen zaman geldiğinde BroadcastReceiver sınıfı açar. Bu BroadcastReceiver'a PendingIntent'e giren Intent nesnesi üzerinden argümanları iletmenin herhangi bir yolu olup olmadığını merak ediyorum.Android'de bir Niyet aracılığıyla bir BroadcastReceiver öğesine argümanlar iletme

Temelde Yapmak istediğim şey böyle bir şeydir:

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); 

ve ben BroadcastReceiver en OnReceive (Bağlam, Niyet) yöntemi içinde ARG1 almak edebilmek istiyorum. Yerel değişken my_intent'in PendingIntent tarafından onReceive'a iletilen ikinci parametre olacağını düşündüm, ancak görünüşe göre bu doğru değil. Bir Aktivite ile BroadcastReceiver arasında bu modada parametreler iletilebilir mi (Intent.putExtra() kullanılarak) veya bunun yerine bir ContentProvider kullanmalı mıyım?

Teşekkürler!

Iva

cevap

1

Ben çaldığında başka Etkinlik başladığında AlarmManager, kullanarak bir alarmı ayarlayan bir uygulama var. Kötü şeklidir

. çok iyi neden olmadan (örneğin, gelen bir telefon çağrısı) habersiz faaliyetler açmayın. Kullanıcı, TXTing gibi bir şey yapmak veya bir oyun oynamak veya telefon menüsü için numaralara dokunmaya çalışmaksa ne yapmalı?

mümkün bu şekilde yılında parametreleri bir Aktivite ve BroadcastReceiver arasındaki geçmek mi (Intent.putExtra kullanarak())

Evet. Ancak, PendingIntent.FLAG_UPDATE_CURRENT nolu PendingIntent nolu kısmını oluştururken, Intent üzerinde sağladığınız yeni ekstraların gerçekten kullanıldığından emin olmak için kullanacağınızı unutmayın.

+0

Ah evet, yanlış konuştum; Alarmı belirli bir zamanda belirli bir aktiviteyi çağırmak için bir cadde olarak kullanıyorum ve alarm çaldığında, kullanıcının daha sonra ne zaman uygun bir yere düştüğü ve sadece aktiviteyi çağırdığı bir bildirim oluşturuyorum. Yaptıklarında ne olursa olsun rahatsız etmeyin. Cevabınız için teşekkürler! – ivcheto

+0

Hmm, PendingIntent.FLAG_UPDATE_CURRENT değerini PendingIntent öğesinin bir şey değiştirirken görünmeyeceği şekilde ekleyerek; Orijinal Aktivite'mdeki amacımdan gelen ekleri hala onLece – ivcheto

+1

'a iletilen niyete alamıyorum. PendingIntent'i oluşturmadan önce putExtra() yöntemini mi çağırıyorsunuz? PendingIntent, Intent'i serileştirdiğinde bunu bilmiyorum, ancak eğer hemen yaparsa, PendingIntent'i oluşturduktan sonra putExtra() çağrıları hiçbir etki yapmaz. – CommonsWare

1

Evet, ben bir PendingIntent sarılı bir Niyet ekstralar temel Java türü ve Serializable/Parceable türlerinin herhangi veri aktarmak ve sonra geçirilen Niyet örneğini kullanarak bunları almak mümkün olduğunu düşünüyorum Broadcastreceiver onReceive. Yaklaşımın bana uygun görünüyor.

Aldığınız sorun/hata nedir? "Arg1" örneği Seri hale getirilebilir mi?

+0

Hata alıyorum; BroadcastReceiver'ın onReceive (Context, Intent) yöntemine iletilen niyetle bir paket almıyorum; Benim BroadcastReceiver'ime iletilen niyetin benim Faaliyetimde yarattığım (ve doldurduğum) niyetle aynı olduğunu farz ediyorum. Bu durumda, geçmek istediğim herhangi bir argüman gerçekten Seri hale getirilebilir. – ivcheto

+0

Bize putExtra (..) yazan ve/veyaXXXExtra (..) adlı kodunuzu gösterebilir misiniz? – Samuh

+1

Bu sadece putExtra koymak gerekiyordu çıkıyor (...) PendingIntent oluşturmadan önce çağırır. Yardım ettiğin için teşekkür ederim! – ivcheto

9

Benzer bir sorunla karşılaştım, ancak PendingIntent içine sarmadan önce Intent'i zaten doldurdum. Ama benim sorunun cevabı, yukarıda belirtildiği gibi, PendingIntent.FLAG_UPDATE_CURRENT bayrağını kullanmam gerektiğiydi. Bayrağı ayarladığımda işe yaradı! Umarım bu diğerlerine yardım eder. -Jeff

+0

Aynı sorunu yaşıyordum ve bayrak tamamen yaptı. Teşekkürler! – DanO

+0

Sen bir hayat kurtarıcısın! –

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); 
    } 
}