我正在为Android构建基于任务的应用程序。
我需要将一个任务对象从setAlarm方法传递给onReceive方法来配置自定义警报,但onReceive从该包中获取null:
Bundle bundle = intent.getExtras();
Task task = (Task) bundle.getSerializable("task");
这是我的代码:
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Task task = (Task) bundle.getSerializable("task");
Intent service = new Intent(context, SchedulingService.class);
service.putExtra("task", task);
startWakefulService(context, service);
}
public void setAlarm(Context context, Task task) {
alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
intent.putExtra("task", task);
intent.setAction("com.blah.Action");
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
Calendar calendar = Calendar.getInstance();
try {
Date date = format.parse(task.getDate());
calendar.setTime(date);
StringTokenizer stringTokenizer = new StringTokenizer(task.getTime(), ":");
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(stringTokenizer.nextToken()));
calendar.set(Calendar.MINUTE, Integer.parseInt(stringTokenizer.nextToken()));
} catch (ParseException e) {
e.printStackTrace();
}
alarmMgr.set(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), alarmIntent);
ComponentName receiver = new ComponentName(context, BootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
它出了什么问题?
修改
我试过传递一个字符串和一个int,并在两种情况下都有效。我的任务类有问题吗?
public class Task implements Serializable {
private int id;
private String name;
private String date;
private String time;
private String date_creation;
private String description;
private String location;
private String image;
private String state;
private String state2;
private String profile;
public Task() {
}
public Task(int id, String name, String date, String time, String date_creation, String description, String location, String image, String state, String state2, String profile) {
this.setId(id);
this.setName(name);
this.setDate(date);
this.setTime(time);
this.setDate_creation(date_creation);
this.setDescription(description);
this.setLocation(location);
this.setImage(image);
this.setState(state);
this.setState2(state2);
this.setProfile(profile);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getState2() {
return state2;
}
public void setState2(String state2) {
this.state2 = state2;
}
public String getProfile() {
return profile;
}
public void setProfile(String profile) {
this.profile = profile;
}
public String getDate_creation() {
return date_creation;
}
public void setDate_creation(String date_creation) {
this.date_creation = date_creation;
}
}
setAlarm中的意图有额外的内容,但onReceive是空的。
我尝试将任务ID作为唯一的requestCode传递,但没有成功。
我正在API 22中启动该应用
答案 0 :(得分:1)
您可以尝试使用Parcelable界面:
public class Task implements Parcelable {
private int id;
private String name;
private String date;
private String time;
private String date_creation;
private String description;
private String location;
private String image;
private String state;
private String state2;
private String profile;
public Task() {
}
public Task(int id, String name, String date, String time, String date_creation, String description, String location, String image, String state, String state2, String profile) {
this.id = id;
this.name = name;
this.date = date;
this.time = time;
this.date_creation = date_creation;
this.description = description;
this.location = location;
this.image = image;
this.state = state;
this.state2 = state2;
this.profile = profile;
}
protected Task(Parcel in) {
id = in.readInt();
name = in.readString();
date = in.readString();
time = in.readString();
date_creation = in.readString();
description = in.readString();
location = in.readString();
image = in.readString();
state = in.readString();
state2 = in.readString();
profile = in.readString();
}
public static final Creator<Task> CREATOR = new Creator<Task>() {
@Override
public Task createFromParcel(Parcel in) {
return new Task(in);
}
@Override
public Task[] newArray(int size) {
return new Task[size];
}
};
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeString(name);
dest.writeString(date);
dest.writeString(time);
dest.writeString(date_creation);
dest.writeString(description);
dest.writeString(location);
dest.writeString(image);
dest.writeString(state);
dest.writeString(state2);
dest.writeString(profile);
}
@Override
public int describeContents() {
return 0;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getState2() {
return state2;
}
public void setState2(String state2) {
this.state2 = state2;
}
public String getProfile() {
return profile;
}
public void setProfile(String profile) {
this.profile = profile;
}
public String getDate_creation() {
return date_creation;
}
public void setDate_creation(String date_creation) {
this.date_creation = date_creation;
}
}
然后用来放入一个包:putParcelable("task", myTask);
并检索:
Task myTask = (Task) bundle.getParcelable("task");
答案 1 :(得分:1)
这可能不是您设备的问题。 我认为ParcelableExtra在广播接收器的情况下会被丢弃! 我也是使用PendingIntent传递它,但是当广播接收器触发活动时,它没有重新附加额外的内容,导致活动在尝试getParcelableExtras时为空。