2010-05-21 9 views
36

Tôi đang cố gắng thực hiện một số báo thức sau khi người dùng chọn thứ gì đó có thời gian từ danh sách và tạo thông báo cho nó tại thời điểm đã cho. Vấn đề của tôi là "showame" mà một putExtra trên Intent của tôi không thể nhận được tại bộ thu phát sóng. Nó luôn nhận giá trị null. Đây là cách tôi làm điều đó cho hầu hết các ý định của tôi nhưng tôi nghĩ rằng thời gian này có lẽ vì pendingIntent hoặc BroadcastReceiver một cái gì đó cần phải được thực hiện differelly. Cảm ơn bạngetExtra từ Intent được khởi chạy từ một pendingIntent

Chức năng sẽ gửi tiếp cận mục đích thông qua mục đích cấp phát

public void setAlarm(String showname,String time) { 

    String[] hourminute=time.split(":"); 
    String hour = hourminute[0]; 
    String minute = hourminute[1]; 
    Calendar rightNow = Calendar.getInstance(); 
    rightNow.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hour)); 
    rightNow.set(Calendar.MINUTE, Integer.parseInt(minute)); 
    rightNow.set(Calendar.SECOND, 0); 
    long t=rightNow.getTimeInMillis(); 
    long t1=System.currentTimeMillis(); 

    try { 

    Intent intent = new Intent(this, alarmreceiver.class); 
    Bundle c = new Bundle();    
    c.putString("showname", showname);//This is the value I want to pass 
    intent.putExtras(c); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 12345, intent, 0); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, rightNow.getTimeInMillis(),pendingIntent); 
    //Log.e("ALARM", "time of millis: "+System.currentTimeMillis()); 
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show(); 

    } catch (Exception e) { 
     Log.e("ALARM", "ERROR IN CODE:"+e.toString()); 
    } 
} 

Và đây là kết thúc nhận

public class alarmreceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    // Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();  
    Bundle b = intent.getExtras(); 
    String showname=b.getString("showname");//This is where I suppose to receive it but its null 
    NotificationManager manger = (NotificationManager) context 
      .getSystemService(context.NOTIFICATION_SERVICE); 

    Notification notification = new Notification(R.drawable.icon, 
      "TVGuide Υπενθύμιση", System.currentTimeMillis()); 
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, 
      new Intent(context, tvguide.class), 0); 

    notification.setLatestEventInfo(context, "Το Πρόγραμμα Ξεκίνησε", 
      showname, contentIntent); 

    notification.flags = Notification.FLAG_ONLY_ALERT_ONCE; 

    notification.sound = Uri.parse("file:///sdcard/dominating.mp3"); 
    notification.vibrate = new long[]{100, 250, 100, 500}; 
    manger.notify(1, notification); 
}   
} 

Trả lời

23

Intents được tái sử dụng trong hệ thống, trừ khi chúng khác nhau về bối cảnh/hành động tôi tin. Documentation Link. Nghĩa là, nếu bạn đã xây dựng một Intent, ý định đó có thể được sử dụng sau này.

Là bản kiểm tra gỡ lỗi, bạn có thể thử thêm intent.setAction("" + Math.random()) bên dưới intent.putExtras(c) và xem liệu tính năng bổ sung của bạn có được nhận ở đầu bên kia hay không.

liên quan Tài liệu:

Vì hành vi này, điều quan trọng là phải biết khi hai Intents được coi là giống nhau cho các mục đích thu hồi một PendingIntent. Một sai lầm phổ biến mà mọi người mắc phải là tạo ra nhiều đối tượng PendingIntent với Intent chỉ thay đổi trong nội dung "phụ" của chúng, mong đợi nhận được một PendingIntent khác nhau mỗi lần. Điều này không xảy ra. Các phần của Intent được sử dụng để khớp là những phần giống nhau được định nghĩa bởi Intent.filterEquals. Nếu bạn sử dụng hai đối tượng Intent tương đương với Intent.filterEquals, thì bạn sẽ nhận được cùng một PendingIntent cho cả hai đối tượng đó.

+2

Đây là câu trả lời đúng ……… – Necronet

+1

+1, đây là câu trả lời đúng, cần được chấp nhận.Nó thực sự hữu ích, Thx. (BTW, bạn cũng có thể sử dụng một mã yêu cầu khác khi tạo mục đích đang chờ xử lý, với một băm, điều đó khá thuận tiện). – Snicolas

50

Nếu bạn thay đổi giá trị Extra trong mục đích, khi tạo mục đích đang chờ bạn nên sử dụng cờ PendingIntent.FLAG_CANCEL_CURRENT.

Một ví dụ đơn giản sẽ là

PendingIntent pi = PendingIntent.getBroadcast(context, 0,intentWithNewExtras,PendingIntent.FLAG_CANCEL_CURRENT); 

Đây là cách đúng đắn và sẽ đảm bảo rằng các giá trị mới của bạn được giao.

Hy vọng điều đó sẽ hữu ích.

+0

Điều này dường như không hoạt động trong widget với flipper một cách minh bạch khi một ý định được đưa ra hệ thống cố gắng sử dụng lại nó và không có thêm được thay đổi. – Necronet

+3

Làm việc cho tôi, tôi đã bị mắc kẹt hàng giờ! – Ali

+3

Giải quyết vấn đề của 2 giờ .... –

9

sử dụng mã yêu cầu khác nhau cho các thông báo báo thức khác nhau để tránh ghi đè lên cùng thời gian báo thức.

+0

Đây là câu trả lời hay nhất cho loại câu hỏi này! Cách giải quyết rất đơn giản và đẹp mắt cho một vấn đề. –

+0

Tôi đồng ý, cách giải quyết đơn giản tuyệt vời. – jp36

0

Bạn nên sử dụng phương thức intent.putExtra(). Không đặt nhóm thành phân đoạn bổ sung. NẾU bạn thiết lập chuỗi, bạn whould intent.putExtra(<key>, value); Hãy thử điều này nó sẽ được thực hiện. Tôi đã sử dụng nó.

0

Tôi đã gặp sự cố tương tự. Tôi đã giải quyết nó bằng cách thiết lập một hành động nhằm mục đích như được đề xuất bởi @aioobe ở đây, và mục đích của tôi hoạt động như một phép thuật.

Ở đây những gì tôi đã làm

` intent.putExtra("Name", mName); 
    intent.putExtra("dateTime", newdate); 
    intent.setAction("" + Math.random());` 

Hy vọng nó sẽ giúp ai đó, hạnh phúc mã hóa ..! :)