2017-12-19 16 views
0

ResolveInfoオブジェクトをパーセルに書き込んだ後、このパーセルからResolveInfoを作成するという簡単な作業に悩まされています。残念ながら、私のコードがクラッシュしたり、java.lang.IllegalStateExceptionをスローしたりすることはありません。ここでAndroid ResolveInfo完全に解読されていないパーセルブル

は私のコードResolveInfo ActivityInfo、SERVICEINFOまたはProviderInfo属性のいずれも存在しない場合、例外がスローされResolveInfoクラスのソースコードを見てみると

fun failingFunction(resolveInfo:ResolveInfo){ 
    Log.d(TAG,"original label ${resolveInfo.loadLabel(this.packageManager)}") 
    val p = Parcel.obtain() 
    resolveInfo.writeToParcel(p, 0) 
    val copy = ResolveInfo.CREATOR.createFromParcel(p) 
    Log.d(TAG,"copy label ${copy.loadLabel(this.packageManager)}") // throws java.lang.IllegalStateException: Missing ComponentInfo! 
} 

です。したがって、これらが欠落していないかどうかを確認するログを追加しました。

fun failingFunction(resolveInfo:ResolveInfo){ 
    Log.d(TAG,"original activity info ${resolveInfo.activityInfo}") 
    Log.d(TAG,"original service info ${resolveInfo.serviceInfo}") 
    Log.d(TAG,"original provider info ${resolveInfo.providerInfo}") 
    Log.d(TAG,"original label ${resolveInfo.loadLabel(this.packageManager)}") 
    val p = Parcel.obtain() 
    resolveInfo.writeToParcel(p, 0) 
    val copy = ResolveInfo.CREATOR.createFromParcel(p) 
    Log.d(TAG,"copy activity info ${copy.activityInfo}") 
    Log.d(TAG,"copy service info ${copy.serviceInfo}") 
    Log.d(TAG,"copy provider info ${copy.providerInfo}") 
    Log.d(TAG,"copy label ${copy.loadLabel(this.packageManager)}") 
} 

私の元のResolveInfoオブジェクトにはActivityInfoがありますが、私のコピーにはありません。 ActivityInfoはParcelableを実装しているので、Parcelに書き込まれていない理由がわかりません。 ResolveInfoのソースによれば、小包に記述する必要がありますし、そこから読み:

public void writeToParcel(Parcel dest, int parcelableFlags) { 
    if (activityInfo != null) { 
     dest.writeInt(1); 
     activityInfo.writeToParcel(dest, parcelableFlags); 
    } else if (serviceInfo != null) { 
     dest.writeInt(2); 
     serviceInfo.writeToParcel(dest, parcelableFlags); 
    } else if (providerInfo != null) { 
     dest.writeInt(3); 
     providerInfo.writeToParcel(dest, parcelableFlags); 
    } else { 
     dest.writeInt(0); 
    } 
    if (filter != null) { 
     dest.writeInt(1); 
     filter.writeToParcel(dest, parcelableFlags); 
    } else { 
     dest.writeInt(0); 
    } 
    dest.writeInt(priority); 
    dest.writeInt(preferredOrder); 
    dest.writeInt(match); 
    dest.writeInt(specificIndex); 
    dest.writeInt(labelRes); 
    TextUtils.writeToParcel(nonLocalizedLabel, dest, parcelableFlags); 
    dest.writeInt(icon); 
    dest.writeString(resolvePackageName); 
    dest.writeInt(targetUserId); 
    dest.writeInt(system ? 1 : 0); 
    dest.writeInt(noResourceId ? 1 : 0); 
    dest.writeInt(iconResourceId); 
    dest.writeInt(handleAllWebDataURI ? 1 : 0); 
    dest.writeInt(isInstantAppAvailable ? 1 : 0); 
} 

private ResolveInfo(Parcel source) { 
    activityInfo = null; 
    serviceInfo = null; 
    providerInfo = null; 
    switch (source.readInt()) { 
     case 1: 
      activityInfo = ActivityInfo.CREATOR.createFromParcel(source); 
      break; 
     case 2: 
      serviceInfo = ServiceInfo.CREATOR.createFromParcel(source); 
      break; 
     case 3: 
      providerInfo = ProviderInfo.CREATOR.createFromParcel(source); 
      break; 
     default: 
      Slog.w(TAG, "Missing ComponentInfo!"); 
      break; 
    } 
    if (source.readInt() != 0) { 
     filter = IntentFilter.CREATOR.createFromParcel(source); 
    } 
    priority = source.readInt(); 
    preferredOrder = source.readInt(); 
    match = source.readInt(); 
    specificIndex = source.readInt(); 
    labelRes = source.readInt(); 
    nonLocalizedLabel 
      = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); 
    icon = source.readInt(); 
    resolvePackageName = source.readString(); 
    targetUserId = source.readInt(); 
    system = source.readInt() != 0; 
    noResourceId = source.readInt() != 0; 
    iconResourceId = source.readInt(); 
    handleAllWebDataURI = source.readInt() != 0; 
    instantAppAvailable = isInstantAppAvailable = source.readInt() != 0; 
} 

クルーの誰このネストされたParcelableが正しくunparceledない理由を?役に立つフラグを紛失していますか?私はこの問題を解決する方法を見つけたので

答えて

0

[OK]を

おかげで、それはParcelableクリエーター方法ではなく途中、私は小包を使用していたとは何の関係もありませんでした。パーセルに書き込んだら、引数値として0を指定してsetDataPositionを呼び出さなければなりません。

fun failingFunction(resolveInfo:ResolveInfo){ 
    Log.d(TAG,"original label ${resolveInfo.loadLabel(this.packageManager)}") 
    val p = Parcel.obtain() 
    resolveInfo.writeToParcel(p, 0) 
    p.setDataPosition(0) 
    val copy = ResolveInfo.CREATOR.createFromParcel(p) 
    Log.d(TAG,"copy label ${copy.loadLabel(this.packageManager)}") // no longer throws java.lang.IllegalStateException 
} 

私のコードは次のようになりました

関連する問題