Отправить ArrayList <Object>из BroadCastReceiver в активность - PullRequest
5 голосов
/ 13 марта 2012

Сценарий:

  • У меня запланирован запуск будильника в указанное время. Каждый раз, когда выполняется мой BroadCastReceiver срабатывает.

  • В BroadCastReceiver я делаю все виды проверок, и в итоге получается ArrayList класса Notify

  • Я отображаю Уведомление в строке состояния

  • Когда пользователь нажимает на Уведомление, я отображаю Активность. Мне нужно в своей Деятельности, ArrayList, чтобы отобразить его на представлениях.

Вот пример кода:

public class ReceiverAlarm extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
         ArrayList<Notify> notifications = new ArrayList<Notify>();

         //do the checks, for exemplification I add these values
         notifications.add(new Notify("id1","This is very important"));
         notifications.add(new Notify("id2","This is not so important"));
         notifications.add(new Notify("id3","This is way too mimportant"));

         NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
         //init some values from notificationManager
         Intent intentNotif = new Intent(context, NotificationViewer.class);
                intentNotif.putParcelableArrayListExtra("list", notifications);
         PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intentNotif, 0);


         Notification notification = new Notification(icon, text, when);
         notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
         notificationManager.notify(NOTIFICATION_ID, notification);
    }

И

   public class NotificationViewer extends Activity {


            @Override
            protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.notification_viewer);

                   ArrayList<Notify> testArrayList = null;

        Bundle b = getIntent().getExtras();
        if (b != null) {
            testArrayList = b.getParcelableArrayList("list");
        }
    }

И

public class Notify implements Parcelable {

    public Notify(Parcel in) {
        readFromParcel(in);
    }

    @SuppressWarnings("rawtypes")
    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
        public Notify createFromParcel(Parcel in) {
            return new Notify(in);
        }

        public Notify[] newArray(int size) {
            return new Notify[size];
        }
    };

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(id);
        dest.writeString(text);
    }

    private void readFromParcel(Parcel in) {
        id = in.readString();
        text = in.readString();
    }

    public Notify(String id, String text) {
        super();
        this.id = id;
        this.text = text;
    }

    /** The id. */
    public String id;

    /** Notification text to be displayed. */
    public String text;

    @Override
    public int describeContents() {
        return 0;
    }

}

On testArrayList = b.getParcelableArrayList ("list"); Из NotificatioNActivity я получаю эту ошибку:

E/AndroidRuntime(14319): java.lang.RuntimeException: Unable to start activity

ComponentInfo {NotificationViewer}: java.lang.RuntimeException: Parcel android.os.Parcel@4050f960: Unmarshalling неизвестный код типа 7602277 в смещение 124

Как вы видите, из цитат из SO я говорю, что мне нужно было сделать мой объект Parcelable. Может, я что-то там не так сделал, но ... я не знаю, как это исправить. Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 13 марта 2012

В NotificationViewer значения извлечения активности, такие как:

ArrayList<Notify> testArrayList = getIntent().getParcelableArrayListExtra("list");

Вы вводите значения с помощью putParcelableArrayListExtra(), поэтому вам нужно получить значение с помощью

getParcelableArrayListExtra() вместо getParcelableArrayList().

1 голос
/ 13 марта 2012

Комбинирование пользовательских Parcelable s и PendingIntent s довольно сомнительно, но, если повезет, Intent - это Parcelable, почему бы просто не передать Intent, полученный вами в качестве дополнительного, Intent вы заключаете в PendingIntent - что позволяет получателю Activity или Service выполнять обработку?

Редактировать : Как указано в этом ответе от CW.

Редактировать : Пример

Ваш класс ReceiverAlarm будет работать "примерно так":

public class ReceiverAlarm extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        Intent intentNotif = new Intent(context, NotificationViewer.class);
        intentNotif.putExtra("intent", intent);
        PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intentNotif, 0);

        Notification notification = new Notification(icon, text, when);
        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
        notificationManager.notify(NOTIFICATION_ID, notification);
    }
}

А в NotificationViewer активности:

public class NotificationViewer extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        // Fetch the Intent you received in your BroadcastReceiver
        Intent broadcastIntent = getIntent().getParcelableExtra("intent");

        if (broadcastIntent != null) {
            // Do processing previously done in the receiver here 
            // and create your "Notify" objects.
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...