[英]getParcelableExtra always null on Pending Intent, but not Intent
我是Java新手,更不用说Android开发了。 我没有编码背景,但以为我会从“简单”的东西开始,例如闹钟。 因此,现在我正在编写一个闹钟,如果要在闹钟响起后不再重复,请将其更新为不活动。 当我故意将可拆分的AlarmClass(我的警报对象)传递到警报设置屏幕时,它通过就很好了。 当我将相同的AlarmClass传递给一个Intent,并将其放在Alarm Manager中的PendingIntent中,然后尝试从可以消除该警报的屏幕上获取它时,我正在调用的AlarmClass对象并以完全相同的方式进行填充始终为null。
这是我的闹钟课程:
package com.example.wakeme;
import java.util.Calendar;
import android.os.Parcel;
import android.os.Parcelable;
public class AlarmClass implements Parcelable{
Calendar cal = Calendar.getInstance();
private long id = 1;
private int active = 1;
private long time = cal.getTimeInMillis();
private int repeating = 0;
private int skipweekends = 0;
private int skipweekdays = 0;
private int alarmnumber = -1;
public long getId(){
return id;
}
public void setId(long id) {
this.id = id;
}
public int getActive(){
return active;
}
public void setActive(int active) {
this.active = active;
}
public int getRepeating(){
return repeating;
}
public void setRepeating(int repeating){
this.repeating = repeating;
}
public void setTime(long time){
this.time = time;
}
public long getTime(){
return time;
}
public int getSkipWeekends(){
return skipweekends;
}
public void setSkipWeekends(int skipweekends){
this.skipweekends = skipweekends;
}
public int getSkipWeekdays(){
return skipweekdays;
}
public void setSkipWeekdays(int skipweekdays){
this.skipweekdays = skipweekdays;
}
public void setAlarmNumber(int alarmnumber){
this.alarmnumber = alarmnumber;
}
public int getAlarmNumber(){
return alarmnumber;
}
@Override
public int describeContents(){
return 0;
}
private AlarmClass(Parcel in){
this.id = in.readLong();
this.active = in.readInt();
this.repeating = in.readInt();
this.skipweekdays = in.readInt();
this.skipweekends = in.readInt();
this.time = in.readLong();
this.alarmnumber = in.readInt();
}
AlarmClass() {
return;
}
public void writeToParcel(Parcel out, int flags) {
out.writeLong(this.id);
out.writeInt(this.active);
out.writeInt(this.repeating);
out.writeInt(this.skipweekdays);
out.writeInt(this.skipweekends);
out.writeLong(this.time);
out.writeInt(this.alarmnumber);
}
public static final Parcelable.Creator<AlarmClass> CREATOR = new Parcelable.Creator<AlarmClass>(){
public AlarmClass createFromParcel(Parcel in){
return new AlarmClass(in);
}
public AlarmClass[] newArray(int size) {
return new AlarmClass[size];
}
};
从这里,我可以将对象传递给警报设置器以对其进行更新:
public void startSet(View view){
Intent set = new Intent(this, SetAlarm.class);
set.putExtra("alarm", new AlarmClass());
startActivity(set);
}
我在这里的时间安排器上就收到了它。 非空值:
public class SetAlarm extends MainActivity {
AlarmClass passAlarm = new AlarmClass();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.alarm_set);
setAlarmSetListener();
setDeleteListener();
passAlarm = (AlarmClass) getIntent().getParcelableExtra("alarm");
if(passAlarm.getAlarmNumber() != -1){
TimePicker picker = (TimePicker) findViewById(R.id.timePicker1);
Calendar passedTime = Calendar.getInstance();
passedTime.setTimeInMillis(passAlarm.getTime());
picker.setCurrentHour(passedTime.get(Calendar.HOUR_OF_DAY));
picker.setCurrentMinute(passedTime.get(Calendar.MINUTE));
String ampm = (passedTime.get(Calendar.HOUR_OF_DAY) > 12 ? "pm" : "am");
String message = "Passed Time is: " + (passedTime.get((Calendar.HOUR_OF_DAY)%12)!=0?(passedTime.get(Calendar.HOUR_OF_DAY)%12):12) + ":" + passedTime.get(Calendar.MINUTE) + " " + ampm;
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
}
else{
// Do Nothing
}
}
但是当这样通过PendingIntent发送时:
private void newAlarm(AlarmClass alarmclass){
Intent intent = new Intent(getBaseContext(), Alarm.class);
intent.putExtra("alarm", alarmclass);
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(alarmclass.getTime());
AlarmsDataSource alarm = new AlarmsDataSource(this);
alarm.open();
AlarmClass alarmObject = new AlarmClass();
alarmObject = alarm.createAlarm(true, cal.getTimeInMillis(), false, false, false);
PendingIntent torpedo = PendingIntent.getBroadcast(this,alarmObject.getAlarmNumber(),intent,PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager goOff = (AlarmManager) getSystemService(ALARM_SERVICE);
goOff.set(AlarmManager.RTC_WAKEUP, alarmObject.getTime() ,torpedo);
Toast.makeText(getApplicationContext(), "Alarm Number " + alarmObject.getAlarmNumber(), Toast.LENGTH_LONG).show();
alarm.close();
}
并以相同的方式收到警报活动:
public class Boom extends MainActivity{
AlarmClass boomAlarm = new AlarmClass();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Window wake = getWindow();
wake.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
setContentView(R.layout.boom);
setTheme(R.style.AlarmStyle);
overridePendingTransition(android.R.anim.fade_in,5000);
boomAlarm = (AlarmClass) getIntent().getParcelableExtra("alarm");
// Vibrator buzz = (Vibrator) getSystemService(VIBRATOR_SERVICE);
// buzz.vibrate(1000);
snoozeListener();
dismissListener();
}
我传递给boomAlarm的传递的可包裹对象始终为null。
有谁知道为什么可包裹对象在意图中可以正常工作,而在PendingIntent的另一端却为空?
听起来您在使用自定义Parcelable时面临类似于ClassNotFoundException的问题
使用自定义Parcelable时 , https://code.google.com/p/android/issues/detail? id = 6822以及在ClassNotFoundException的答案中介绍了一种解决方法
事实证明,ParcelableExtra正在广播接收器处掉落! 但是,我确实是通过了它,但是,当广播接收器触发该活动时,它并没有重新附加这些附加内容。 尝试获取ParcelableExtras时,导致活动为null。
编辑:我认为你的问题在这一行:
PendingIntent torpedo = PendingIntent.getBroadcast(this,alarmObject.getAlarmNumber(),intent,PendingIntent.FLAG_UPDATE_CURRENT);
您不是在这里开始活动,而是BroadCast尝试如下进行更改:
PendingIntent torpedo = PendingIntent.getActivity(this,alarmObject.getAlarmNumber(),intent,PendingIntent.FLAG_UPDATE_CURRENT);
将PendingIntent.getBroadcast()
更改为PendingIntent.getActivity()
;
并尝试更改以下内容:
Intent intent = new Intent(getBaseContext(), Alarm.class);
至
Intent intent = new Intent(this , Alarm.class);
要么
Intent intent = new Intent(getApplicationContext(), Alarm.class);
尝试
boomAlarm = (AlarmClass) getIntent().getExtras().get("alarm");
代替
boomAlarm = (AlarmClass) getIntent().getParcelableExtra("alarm");
如果不起作用
使AlarmClass扩展可序列化而不是可扩展。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.