无法在活动中获取序列化捆绑包

时间:2017-12-13 12:14:36

标签: java android android-bundle

我有一个班级public class Alarm implements Serializable。这有一个方法:

public void schedule(Context context) {
    setAlarmActive(true);

    Intent myIntent = new Intent(context, AlarmAlertBroadcastReciever.class);

    Bundle bundle = new Bundle();
    bundle.putSerializable("alarm", this);
    myIntent.putExtras(bundle);
    //myIntent.putExtra("alarm", this);

    Alarm alarm = (Alarm) bundle.getSerializable("alarm");

    if(alarm !=null){
        Log.d("Alarmdebug", "alatm is not null");
    }

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, myIntent,PendingIntent.FLAG_CANCEL_CURRENT);

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

    alarmManager.set(AlarmManager.RTC_WAKEUP, getAlarmTime().getTimeInMillis(), pendingIntent);                 
}

在其他地方我有这个代码。哪个无法获得serialized个额外内容。这是调用的,但alarm总是 null

    Bundle bundle = intent.getExtras();

    final Alarm alarm = (Alarm) bundle.getSerializable("alarm");

    if(alarm==null){
        Log.d("Alarmdebug", "alarm is null 2");
    }

请告诉我这段代码有什么问题?我在这里尝试了解决方案: Passing data through intent using Serializable ,但它对我不起作用。

谢谢

修改

任何寻找解决方案的人都可以在下面找到它。

1 个答案:

答案 0 :(得分:0)

似乎序列化的捆绑包在某些设备上不起作用。不得不去byte[]

答案在这里:

Pass Serializable Object to Pending Intent

像这样发送:

//AlarmService.java
Intent myIntent = new Intent(getApplicationContext(), AlarmAlertBroadcastReciever.class);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = null;
try {
    out = new ObjectOutputStream(bos);
    out.writeObject(alarm);
    out.flush();
    byte[] data = bos.toByteArray();
    myIntent.putExtra("alarm", data);
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        bos.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, myIntent, PendingIntent.FLAG_CANCEL_CURRENT);

AlarmManager alarmManager = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, alarm.getAlarmTime().getTimeInMillis(), pendingIntent);

像这样接收:

//AlarmAlertBroadcastReceiver.java

@Override
public void onReceive(Context context, Intent intent) {
   ByteArrayInputStream bis = new ByteArrayInputStream(intent.getByteArrayExtra("alarm"));
    ObjectInput in = null;
    Alarm alarm = null;
    try {
        in = new ObjectInputStream(bis);
        alarm = (Alarm)in.readObject();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (in != null) {
                in.close();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}