2013-09-06 35 views
29

Tôi đang cố gắng đặt thêm thông báo trong ý định của mình để chuyển sang AlarmManager được kích hoạt sau. onReceive của tôi gây nên một cách chính xác nhưng extras.getString() trả về nullAndroid không thể chuyển các mục đích bổ sung mặc dù AlarmManager

Setup:

public PendingIntent getPendingIntent(int uniqueRequestCode, String extra) { 
    Intent intent = new Intent(this, ActionReceiver.class); 
    intent.putExtra("EXTRA", extra); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, 
      intent, 0); 
    return pendingIntent; 
} 

public void setSilentLater(TimeRule timeRule) { 
    boolean[] weekdays = timeRule.getReoccurringWeekdays(); 
    int dayOfWeek = 0; 

    for (boolean day : weekdays) { 
     dayOfWeek++; 
     if (day == true) { 
      Calendar cal = Calendar.getInstance(); 

      AlarmManager alarmManager = (AlarmManager) this 
        .getSystemService(Context.ALARM_SERVICE); 

      cal.set(Calendar.DAY_OF_WEEK, dayOfWeek); 
      cal.set(Calendar.HOUR_OF_DAY, 
        timeRule.getStartTime().get(Calendar.HOUR_OF_DAY)); 
      cal.set(Calendar.MINUTE, 
        timeRule.getStartTime().get(Calendar.MINUTE)); 
      cal.set(Calendar.SECOND, 0); 
      cal.set(Calendar.MILLISECOND, 0); 

      alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
        cal.getTimeInMillis(), 3600000 * 7, getPendingIntent(0, "RINGER_OFF")); 
    } 
} 
} 

Khi điều này gây nên, thông điệp trống: Mã

public class ActionReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Bundle extras = intent.getExtras(); 
     String message = extras.getString("EXTRA"); //empty   
     if(message == "RINGER_OFF") 
     { 
      AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
      am.setRingerMode(AudioManager.RINGER_MODE_SILENT); 
     } 
     else if(message == "RINGER_ON") 
     { 
      AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
      am.setRingerMode(AudioManager.RINGER_MODE_NORMAL); 
     } 
    } 
} 
+1

Bạn có thể xin vui lòng gửi lớp TimeRule của bạn? – Patrick

Trả lời

60

Haresh không phải là câu trả lời hoàn chỉnh ... Tôi đã sử dụng một Bundle và tôi đã thử mà không có Bundle nhưng tôi đã null của một trong hai cách khi tôi cố gắng để có được các chuỗi từ của phụ !!

Vấn đề chính xác, trong mã của bạn, là với PendingIntent!

Đây là sai lầm nếu bạn đang cố gắng để vượt qua thêm của:

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, 0);

0 cho cờ là những gì sẽ làm bạn đau đầu

Đây là con đường đúng để làm điều đó - chỉ định cờ!

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Đây có lẽ là một vấn đề phổ biến như vậy bởi vì Google's sample code lơ là bao gồm của tắm trong một báo động.

+1

Cảm ơn bạn rất nhiều vì điều này! – Marty

+1

Bạn là một vị cứu tinh cuộc sống !! ** vỗ tay ** – Varundroid

+1

Hoàn toàn là một vị cứu tinh cuộc sống! –

-1
// before replace code 
    Bundle extras = intent.getExtras(); 
    String message = extras.getString("EXTRA"); 
// after replace code 
    String message = intent.getStringExtra("EXTRA"); 

        OR 

// before replace code 
    Intent intent = new Intent(this, ActionReceiver.class); 
    intent.putExtra("EXTRA", extra); 
// after replace code 
    Intent intent = new Intent(this, ActionReceiver.class); 
    Bundle bundle = new Bundle(); 
    bundle.putString("EXTRA", extra); 
    intent.putExtras(bundle); 
+1

Xem câu trả lời của @ SomeoneSomewhere bên dưới. Mục đích đang chờ xử lý cần một cờ khác để thực hiện các tính năng bổ sung. – markshiz

20

Tôi có một số biện pháp có thể giúp người khác, được liên kết với giải pháp từ Ai đó ở đâu đó. Nếu bạn vượt qua các đối tượng Parcelable tùy chỉnh như một phần bổ sung, hệ điều hành có thể không xử lý chúng, do đó, một ngoại lệ bên trong xảy ra và các tính năng bổ sung của bạn bị mất.

Với Android N, ngay cả với PendingIntent.FLAG_UPDATE_CURRENT) Tôi không thể truy xuất tính năng bổ sung Pacelable tùy chỉnh của mình.

Vì vậy, tôi đã phải sử dụng hệ thống được gọi là Parcelable (như ParcelUuid) để tham chiếu một số đối tượng trong cơ sở dữ liệu tùy chỉnh thay vì cung cấp toàn bộ đối tượng Parcelable của tôi.

Một giải pháp khác là chuyển đổi Parcelable đến một mảng byte được công nhận một cách chính xác bằng hệ thống: How to marshall and unmarshall a Parcelable to a byte array with help of Parcel?

+6

Tất cả các câu trả lời có cờ không đủ. ** ** ** này là đúng. Cảm ơn bạn. –

+0

Hơn cách gửi mảng byte đến BroadcastReceiver? – aleksandrbel

+0

@aleksandrbel Bằng cách thêm nó làm phụ thêm cho Mục đích của bạn. Ví dụ bạn có phương thức 'putExtra (tên chuỗi, giá trị byte [])' trên 'Intent'. Sau đó, trong 'BroadcastReceiver' bạn trích xuất mảng byte từ Intent bằng cách sử dụng' getByteArrayExtra'. Mục đích được cung cấp cho người nhận của bạn thông qua phương thức 'onReceive'. –