2009-10-04 15 views
9

Ben gelecekteki olayların hatırlatıcı belirlemek için kullanılabilecek küçük bir uygulama var. Uygulamaya kullanıcının hatırlatılması gereken zamanı ayarlamak için bir AlarmManager kullanır. Alarm çaldığında, bir BroadcastReceiver bunu kaydeder ve sırayla kullanıcıyı bir tost ve durum çubuğunda bir bildirim yoluyla bilgilendirecek bir servis başlatır. bildirim ve tost doğru bilgileri görüntülemek içinYanlış ekstralar Tüm niyet ile alınan ancak birincisi

, bazı ekstra bilgi niyet ile birlikte geçirilir. Bir hatırlatma kaydedildiğinde ilk kez BroadcastReceiver tarafından alınan ve servise iletilen bilgi doğrudur. Fakat takip eden her hatırlatma için (yani BroadcastReceiver tarafından alınan her yeni amaç), gönderilen bilgiler farklı olduğunda bile bu bilgi aynı kalır. dizge "fan" ilk amacı ile yapılan bir ilave olarak konur Bir örnek olarak

, "fon" doğru BroadcastReceiver ile ekstre edilir. İkinci amaçta "bar" fazladan koyulursa, "foo" hala BroadcastReceiver tarafından çıkarılır. BroadcastReceiver sınıfında yöntemi -

Intent intent = new Intent(ACTION_SET_ALARM); 
intent.putExtra("desc", desc); 
intent.putExtra("time", time); 
intent.putExtra("dbId", dbId); 
intent.putExtra("millis", millis); 
PendingIntent pIntent = PendingIntent.getBroadcast(quickAlert.this, 0, intent, 0); 

// Schedule the alarm! 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP, millis, pIntent); 

OnReceive():

@Override 
public void onReceive(Context context, Intent intent) { 

    Intent i = new Intent(context, AlertService.class); 

    String desc = intent.getStringExtra("desc").equals("") ? "": ": " + intent.getStringExtra("desc"); 
    String time = intent.getStringExtra("time"); 
    long dbId = intent.getLongExtra("dbId", -1); 
    long millis = intent.getLongExtra("millis", -1); 

    i.putExtra("desc", desc); 
    i.putExtra("time", time); 
    i.putExtra("dbId", dbId); 
    i.putExtra("millis", millis); 
    Log.d(TAG, "AlertReceiver: " + desc + ", " + time + ", " + dbId + ", " + millis); 

    Toast.makeText(context, "Reminder: " + desc, Toast.LENGTH_LONG).show(); 
    context.startService(i); 
} 

niyet

Bu

niyet (ana UI sınıfı) alarm kaydeder ve geçen kod manifest içinde -filtre:

<receiver android:name=".AlertReceiver"> 
     <intent-filter> 
      <action android:name="com.aspartame.quickAlert.ACTION_SET_ALARM" /> 
     </intent-filter> 
    </receiver> 

Şimdi bir süredir bununla uğraştım, bu yüzden yardım çok çok takdir!

cevap

8

Yukarıdaki cevaplar doğrudur, ancak bir açıklamaya sahip değildirler.

A PendingIntent kendisi basitçe almak için kullanılan orijinal verileri açıklayan sistem tarafından tutulan bir belirteci için bir referans: O PendingIntent documentation bu kısmını belirtmek gerekir. ... sonra oluşturma uygulaması PendingIntent aynı tür (Aynı işlem, aynı niyet aksiyon, veriler, kategorileri ve parçaları ve aynı bayrak) yeniden alır, bu bir PendingIntent aynı belirteç

temsil alacaktır

"Ekstra" verilerin PendingIntent-identity kavramında yer alan numaralı no'lu bilgi olduğunu unutmayın. Ben bu konuda buldum