将数据从PendingIntent(AlarmManager)传递给BroadcastReceiver

我一直在玩本地通知。 我试图将数据传递给BroadcastReceiver; 我注意到,下面的代码适用于棒棒糖,但在我的Nexus 6P与7.1不。

这是我如何设置意图,并添加“额外”的数据:

val am = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager val alarmIntent = Intent(context, AlarmReceiver::class.java) alarmIntent.putExtra("data", data) val pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT) am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), (1000 * 60).toLong(), pendingIntent) // Millisec * Second * Minute 

在BroadcastReceiver中:

 val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager val wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "") wl.acquire() val data = intent.getParcelableExtra<MyData>("data") 

谷歌搜索这个问题并没有带来太多,它提出的是一个SO职位,并提出这个问题的意见。 然而,我还没有看到任何解决方案,我已经尝试了没有工作,所以我想知道如果有人已经想通了一个方法,它将在7.1?

编辑:

这是数据对象:

 data class MyData(val accountNumber: String, val date: Date, val key: Int) : Parcelable { companion object { @JvmField val CREATOR: Parcelable.Creator< MyData > = object : Parcelable.Creator< MyData > { override fun createFromParcel(source: Parcel): MyData = MyData(source) override fun newArray(size: Int): Array< MyData?> = arrayOfNulls(size) } } constructor(source: Parcel) : this( source.readString(), source.readSerializable() as Date, source.readInt() ) override fun describeContents() = 0 override fun writeToParcel(dest: Parcel, flags: Int) { dest.writeString(accountNumber) dest.writeSerializable(date) dest.writeSerializable(key) } 

}

调用val data = intent.getParcelableExtra<MyData>("data")时的日志摘录val data = intent.getParcelableExtra<MyData>("data")

05-19 21:06:37.076 8150-8220 / com.wolfbane.example V / FA:活动恢复,时间:864865 05-19 21:06:37.098 8150-8154 / com.wolfbane.example I / art:Do partial代码缓存收集,代码= 47KB,data = 47KB 05-19 21:06:37 8110-8154 / com.wolfbane.example I / art:代码缓存收集后,代码= 45KB,数据= 46KB 05-19 21:06 :37.098 8150-8154 / com.wolfbane.example I / art:将代码缓存容量增加到256KB 05-19 21:06:37.102 8150-8154 / com.wolfbane.example I / art:JIT为void编译代码分配了61KB android.widget.TextView。(android.content.Context,android.util.AttributeSet,int,int)05-19 21:06:37.102 8150-8154 / com.wolfbane.example I / art:编译器分配4MB来编译void android.widget.TextView。(android.content.Context,android.util.AttributeSet,int,int)05-19 21:06:37.151 8150-8154 / com.wolfbane.example I / art:做完整的代码缓存集合,代码= 111KB,数据= 79KB 05-19 21:06:37.151 8150-8154 / com.wolfbane.example I / art:启动阻塞GC JitCodeCache 05-19 21:06:37.151 815 0-8154 / com.wolfbane.example I / art:代码缓存收集之后,代码= 71KB,data = 40KB 05-19 21:06:42 0879 8150-8220 / com.wolfbane.example V / FA:不活跃,断开连接该服务05-19 21:06:42.829 8150-8157 / com.wolfbane.example I / art:开始阻塞GC仪器05-19 21:07:04.396 8150-8157 / com.wolfbane.example W / art:暂停所有线程都花了:10.531ms

我已经找到了由艾萨克·乔丹解决这个问题

它的要点是传递一个字节数组作为'额外',而不是你的Parcelable类即

将数据添加到意图时:

 val bytes = ParcelableUtil.marshall(data) alarmIntent.putExtra("data", bytes) 

然后在接收端,您将读取数据如下:

 val bytes = intent.getByteArrayExtra("data") val data = MyData(ParcelableUtil.unmarshal(bytes)) 

ParotableUtil在Kotlin

 class ParcelableUtil { companion object { fun marshall(parcelable: Parcelable): ByteArray { val parcel = Parcel.obtain() parcelable.writeToParcel(parcel, 0) val bytes = parcel.marshall() parcel.recycle() return bytes } fun unmarshal(bytes: ByteArray): Parcel { val parcel = Parcel.obtain() parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) return parcel } fun <T> unmarshal(bytes: ByteArray, creator: Parcelable.Creator<T>): T { val parcel = unmarshal(bytes) val result = creator.createFromParcel(parcel) parcel.recycle() return result } }