2017-05-19 11 views
0

私は地元の通知で遊んでいました。私はBroadcastReceiverにデータを渡そうとしています。私は以下のコードがロリポップで動作することに気付きましたが、Nexus 6Pでは7.1では動作しません。PendingIntent(AlarmManager)から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") 

問題をグーグル:BroadcastReceiverで

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 

をこのポストは、このポストと、この正確な問題を述べているコメントです。しかし、私はどんな解決策も見ていないし、私が試したことが働いていないので、誰かが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")

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:部分コードキャッシュの収集を行うコード、コード= 45KB、データ= 46KB 05-19 21:06:37.098 8150-8154/com.wolfbane.example I/art: :37.098 8150-8154/com.wolfbane.example I/art:コードキャッシュ容量を256KBに増やす 05-19 21:06:37.102 8150-8154/com.wolfbane.example I/art:JITでコンパイルされたコードは61KB 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 8150-8154/com.wolfbane.example I/art:コードキャッシュコレクション後、コード= 71KB、データ= 40KB 05-19 21:06:42.079 8150-8220/com.wolfbane 。例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 /アート:すべてのスレッドを一時停止がかかった:私はそれの要旨は 'とバイトの配列を渡すことですIsaac Jordan

によってこれに対する解決策を見つけた

+0

あなたは単に意図から 'ヌル'を受け取っていますか?また、渡すデータが 'Parcelable'ですか? –

+0

はい、それは常にnullです。はい、パーセルブルです。 Lollipopでは問題なく動作します。 – WolfBane

+0

データオブジェクトは 'Parcelable'ですか? –

答えて

2

を10.531msあなたのParcelableクラスではなく、余分な '

意図にデータを追加する:

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

次のように続いて、受信側では、データを読んでいました:Kotlinで

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

ParcelableUtil

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 
    } 
} 
関連する問題