2017-05-19 2 views
0

Ich habe mit lokalen Benachrichtigungen herumgespielt. Ich versuche, Daten an den BroadcastReceiver zu senden. Mir ist aufgefallen, dass der unten stehende Code mit Lollipop funktioniert aber auf meinem Nexus 6P mit 7.1 nicht. DieseÜbergeben von Daten an einen BroadcastReceiver von einem PendingIntent (AlarmManager)

ist, wie ich Setup die Absichten und die 'Extra' Daten hinzufügen:

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 

Im 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") 

das Problem googeln nicht viel bringen, was es tut, bring up ist ein SO-Post und ein Kommentar, der genau dieses Problem erwähnt. Allerdings habe ich keine Lösung gesehen und was ich versucht habe, funktioniert nicht, also habe ich mich gefragt, ob jemand einen Weg gefunden hat, wie es auf 7.1 funktioniert?

Edit:

Dies ist das Datenobjekt:

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) 
} 

}

Auszug aus dem Protokoll beim Aufruf val data = intent.getParcelableExtra<MyData>("data")

05-19 21: 06: 37,076 8150-8220 /com.wolfbane.example V/FA: Aktivität fortgesetzt, Zeit: 864865 05-19 21: 06: 37.098 8150-8154/com.wolfbane.example I/art: Teilweise Codecache sammeln Ionen, Code = 47KB, Daten = 47KB 05-19 21: 06: 37.098 8150-8154/com.wolfbane.example I/art: Nach Code-Cache-Sammlung, Code = 45 KB, Daten = 46 KB 05-19 21:06 : 37.098 8150-8154/com.wolfbane.example I/art: Erhöhung der code cache kapazität zu 256KB 05-19 21: 06: 37.102 8150-8154/com.wolfbane.beispiel I/art: JIT zugeteilt 61KB für kompilierten code von void android.widget.TextView. (android.content.Context, android.util.AttributeSet, int, int) 05-19 21: 06: 37.102 8150-8154/com.wolfbane.beispiel I/art: Compiler zugeordnet 4MB zu kompilieren void android.widget.TextView. (android.content.Context, android.util.AttributeSet, int, int) 05-19 21: 06: 37.151 8150-8154/com.wolfbane.beispiel I/art: Voll Code ausführen Cachesammlung, Code = 111 KB, Daten = 79 KB 05-19 21: 06: 37.151 8150-8154/com.wolfbane.example I/art: Starten eines blockierenden GC JitCodeCache 05-19 21: 06: 37,151 8150-8154/com.wolfbane.example I/art: Nach Code-Cache-Sammlung, Code = 71KB, Daten = 40KB 05-19 21: 06: 42.079 8150-8220/com.wolfbane .beispiel V/FA: Inaktivität, Trennung vom Service 05-19 21: 06: 42.829 8150-8157/com.wolfbane.beispiel I/art: Starten eines blockierenden GC Instrumentation 05-19 21: 07: 04.396 8150- 8157/com.wolfbane.example W/art: alle Themen Suspendieren nahm: 10.531ms

+0

:

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

Dann auf der Empfangsseite die Daten wie folgt lauten würde Erhalten Sie gerade 'null' von der Absicht zurück? Sind Sie sicher, dass die übergebenen Daten "Parcelable" sind? –

+0

Ja das ist richtig, es ist immer Null. Ja, es ist parzellierbar. Beachten Sie, dass es auf Lollipop ohne Probleme funktioniert. – WolfBane

+0

Ist das Datenobjekt 'Parcelable'? –

Antwort

2

I eine Lösung dieses Problems durch Isaac Jordan

der Kern von ihm gefunden haben, ist ein Array von Bytes, die als die "passieren Extra ', anstatt Ihre Parcelable-Klasse, dh

Wenn Ihre Daten auf die Absicht hinzu:

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

ParcelableUtil in 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 
    } 
} 
Verwandte Themen