2016-05-29 2 views
1

Мне нужно сохранить объект PendingIntent, который я получаю из объекта StatusBarNotification. PendingIntent pendingIntent = sbn.getNotification(). ContentIntent;Как сохранить ожидающее намерения локально на телефоне

+0

См. Http://stackoverflow.com/questions/6661268/marshalling-a-notification-parcel –

+0

Это было опубликовано еще в 2012 году. По-прежнему это не похоже на конкретное решение. Было бы интересно решить это, что сказать @DavidWasser? –

ответ

0

A PendingIntent может быть сериализован в поток байтов, так как это Parcelable. Создайте Parcel, позвоните writeToParcel() на PendingIntent, чтобы сериализовать объект в Parcel, затем позвоните marshall() по адресу Parcel, чтобы получить байты, которые затем можно записать в файл на устройстве.

ПРИМЕЧАНИЕ: Интерфейс Parcelable не предназначен для долговременного сохранения, поэтому во всех случаях это может не работать. Это зависит от того, для чего вы хотите его использовать.

+0

Спасибо @DavidWasser за ответ. Я пробовал этот подход, и я получил сообщение об ошибке: попытался собрать парцеллу, содержащую объекты Binder. Как мне это преодолеть? –

+0

Извините, вы не можете. Есть некоторые вещи, которые можно поместить в «Посылку», которая не может быть сериализована. Почему вы пытаетесь это сделать? Возможно, мы сможем найти другой способ решить вашу проблему. –

+0

Мне нужно сохранить ожидающий ответ, который я получаю из уведомлений других приложений, чтобы позднее запустить их из моего приложения[email protected] –

0

читать:

PendingIntent pi = PendingIntent.readPendingIntentOrNullFromParcel(parcel); 

Пишите:

PendingIntent.writePendingIntentOrNullToParcel(PendingIntent,parcel); 

редактировать 1:

Parcels cannot be saved right? @ceph3us – Terrel Lewis

Вы можете "Сохранить" Parcelable или посылок

Parcelable -----> 
     Parcel.obtain() -----> 
       Parcelable.writeToParcel(Parcel,0) -----> // write to parcel 
        Parcel.marshal() ----- > byte[] 

тогда байты могут сохраняться в базе данных файлов или в любом другом постоянном или не хранилище данных. Одна вещь, которую вы можете сделать, это Маршаллизация parcelabl, который содержит объект IBinder далее:

перед вами маршалом класс объекта вам необходимо удалить связующее вещество - ссылка на связующее хранится в пространстве ядра. Если связующее происходит от вас, вы должны легко создать новый и позже назначить немаршалированные данные.

+0

Посылки не могут быть сохранены правильно? @ ceph3us –

0

Решение, которое работает для собственного производства PendingIntents (предотвращает "java.lang.RuntimeException: Пытался Маршалл посылки, который содержал объекты связующего вещества."):

public class PersistentPendingIntent implements Parcelable 
{ 
    private enum PendingIntentType{SERVICE, BROADCAST, ACTIVITY} 
    @NonNull 
    private final PendingIntentType pendingIntentType; 
    protected final int requestCode; 
    protected final int flags; 
    @NonNull 
    protected final Intent intent; 

    private PersistentPendingIntent(@NonNull PendingIntentType pendingIntentType, int requestCode, @NonNull Intent intent, int flags) 
    { 
     this.pendingIntentType = pendingIntentType; 
     this.flags = flags; 
     this.intent = intent; 
     this.requestCode = requestCode; 
    } 

    @Nullable 
    public PendingIntent getPendingIntent(@NonNull Context context) 
    { 
     PendingIntent pendingIntent = null; 
     switch (pendingIntentType) 
     { 
      case SERVICE: 
       pendingIntent = PendingIntent.getService(context, requestCode, intent, flags); 
       break; 
      case BROADCAST: 
       pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, flags); 
       break; 
      case ACTIVITY: 
       pendingIntent = PendingIntent.getActivity(context, requestCode, intent, flags); 
       break; 
     } 
     return pendingIntent; 
    } 


    public static PersistentPendingIntent getService(int requestCode, @NonNull Intent intent, int flags) 
    { 
     return new PersistentPendingIntent(PendingIntentType.SERVICE, requestCode, intent, flags); 
    } 

    public static PersistentPendingIntent getActivity(int requestCode, @NonNull Intent intent, int flags) 
    { 
     return new PersistentPendingIntent(PendingIntentType.ACTIVITY, requestCode, intent, flags); 
    } 

    public static PersistentPendingIntent getBroadcast(int requestCode, @NonNull Intent intent, int flags) 
    { 
     return new PersistentPendingIntent(PendingIntentType.BROADCAST, requestCode, intent, flags); 
    } 

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

    @Override 
    public void writeToParcel(Parcel dest, int flags) 
    { 
     dest.writeInt(this.pendingIntentType.ordinal()); 
     dest.writeInt(this.requestCode); 
     dest.writeInt(this.flags); 
     dest.writeParcelable(this.intent, flags); 
    } 

    protected PersistentPendingIntent(Parcel in) 
    { 
     int tmpPendingIntentType = in.readInt(); 
     this.pendingIntentType = PendingIntentType.values()[tmpPendingIntentType]; 
     this.requestCode = in.readInt(); 
     this.flags = in.readInt(); 
     this.intent = in.readParcelable(Intent.class.getClassLoader()); 
    } 

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

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

Использование:

PersistentPendingIntent persistentPendingIntent = PersistentPendingIntent.getService(REQUEST_CANCEL, cancelIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

// Serialization 
Parcel parcel = Parcel.obtain(); 
parcel.writeValue(persistentPendingIntent); 
byte[] serializedPersistentPendingIntent = parcel.marshall(); 
parcel.recycle(); 

// Deserialization 
parcel.unmarshall(serializedPersistentPendingIntent, 0, serializedPersistentPendingIntent.length); 
parcel.setDataPosition(0); 
persistentPendingIntent = (PersistentPendingIntent) parcel.readValue(PersistentPendingIntent.class.getClassLoader()); 

PendingIntent pendingIntent = persistentPendingIntent.getPendingIntent(context); 
Смежные вопросы