【问题标题】:why I don't get extra from intent in onReceive method of the brodcastReceiver?为什么我没有从 brodcastReceiver 的 onReceive 方法中的意图中获得额外的信息?
【发布时间】:2021-09-02 11:52:07
【问题描述】:

我有一个奇怪的问题把我整晚都吵醒了,任何额外的数据都放在广播中,我后来在广播接收器中找不到 这是惊人的类(发件人)

private class Alarming {

    private AlarmManager alarmManager;
    private Intent intent;
    private PendingIntent pendingIntent;

    Alarming() {
        intent = new Intent(TimetableActivity.this, SessionAlarm.class);
        alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    }

    public void setSessionAlarm(FiredAlarm firedAlarm) {

         /*
         we will correct day of month if needed, so we roll elapsed date
         to avoid instant alarming.
         */
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(firedAlarm.getDateInMillis());
        Calendar now = Calendar.getInstance();
        if (calendar.before(now)) {//if session date is before today
            calendar.set(Calendar.YEAR, now.get(Calendar.YEAR));
            calendar.set(Calendar.WEEK_OF_YEAR, now.get(Calendar.WEEK_OF_YEAR));
        }
        firedAlarm.setDateInMillis(calendar.getTimeInMillis());
        Bundle args = new Bundle();
        args.putParcelable(FIRED_ALARM_KEY, firedAlarm);
        intent.putExtras(args);
        intent.putExtra("INT", 54);
        

        pendingIntent =
                PendingIntent.getBroadcast(TimetableActivity.this, firedAlarm.getRequestedCode(), intent, PendingIntent.FLAG_UPDATE_CURRENT);

        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                firedAlarm.getDateInMillis(), AlarmManager.INTERVAL_FIFTEEN_MINUTES / 5, pendingIntent);
       

    }

    
}

这里是广播接收器,intent 不能接收任何类型的数据,primitive、bundle、parcelable...等

public class SessionAlarm extends BroadcastReceiver {
private static final String TAG = "session_alarm_tag";
public static final String FIRED_ALARM_KEY = "fired_alarm_key";
FiredAlarm firedAlarm;
int requestCode;

@Override
public void onReceive(Context context, Intent intent) {
    Log.i(TAG, " Received Integer : " + intent.getIntExtra("INT", -1));
    Bundle bundle = intent.getExtras();
    firedAlarm = bundle.getParcelable(FIRED_ALARM_KEY);
    if (firedAlarm != null) {
       //TODO Blabla...
    } else Log.i("onReceive", "no parcelable fired alarm found!");

}
private void createNotification(Context context, FiredAlarm firedAlarm) {
    //TODO
   

}

这里是 FiredAlarm 类:

public class FiredAlarm implements Parcelable {

private int requestedCode;
private long dateInMillis;
private String classroom;
private int duration;

public String getClassroom() {
    return classroom;
}

public void setClassroom(String classroom) {
    this.classroom = classroom;
}

public int getDuration() {
    return duration;
}

public void setDuration(int duration) {
    this.duration = duration;
}


public FiredAlarm(int requestedCode, long dateInMillis) {
    this.requestedCode = requestedCode;
    this.dateInMillis = dateInMillis;
}

public void setRequestedCode(int requestedCode) {
    this.requestedCode = requestedCode;
}

public void setDateInMillis(long dateInMillis) {
    this.dateInMillis = dateInMillis;
}

public int getRequestedCode() {
    return requestedCode;
}

public long getDateInMillis() {
    return dateInMillis;
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(this.requestedCode);
    dest.writeLong(this.dateInMillis);
    dest.writeString(this.classroom);
    dest.writeInt(this.duration);
}

public void readFromParcel(Parcel source) {
    this.requestedCode = source.readInt();
    this.dateInMillis = source.readLong();
    this.classroom = source.readString();
    this.duration = source.readInt();
}

protected FiredAlarm(Parcel in) {
    this.requestedCode = in.readInt();
    this.dateInMillis = in.readLong();
    this.classroom = in.readString();
    this.duration = in.readInt();
}

public static final Parcelable.Creator<FiredAlarm> CREATOR = new Parcelable.Creator<FiredAlarm>() {
    @Override
    public FiredAlarm createFromParcel(Parcel source) {
        return new FiredAlarm(source);
    }

    @Override
    public FiredAlarm[] newArray(int size) {
        return new FiredAlarm[size];
    }
};

}

我总是得到否定的结果,没有数据,这真的是新 SDK 30 级别的错误还是什么?

【问题讨论】:

  • 你应该发布FireAlarm类的内容。也许你没有实现Parcelable
  • 我使用插件使其可打包
  • 我还是会坚持发布内容
  • 我现在发布了兄弟!
  • 这看起来像一个错误,正如所指出的,之前已经提出过关于此的问题。您可以查看here

标签: java android


【解决方案1】:

我禁用了发送对象,所以原始工作,显然我要将我的对象转换为字节。该解决方案将一直有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多