【问题标题】:Not able to get serialized bundle in an activity无法在活动中获取序列化包
【发布时间】:2017-12-13 12:14:36
【问题描述】:

我有一堂课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,但它对我不起作用。

谢谢

编辑

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

【问题讨论】:

    标签: java android android-bundle


    【解决方案1】:

    似乎序列化的捆绑包在某些设备上不起作用。不得不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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多