2017-07-18 22 views
8

API21 phát hành PersistableBundle là gói mà hệ thống giữ lại cho các mục đích khác nhau (JobScheduler jobs, ShortcutInfos v.v.). Tôi muốn một cách dễ dàng để chuyển đổi Bundle 's có mặt trong mã cũ của tôi để PersistableBundle của ... làm thế nào tôi có thể làm điều đó?Làm cách nào để chuyển đổi Gói thành PersistableBundle?

+1

Tôi tưởng tượng bạn sẽ nhận được một không gian hạn chế cho những gì bạn đang tiết kiệm . Dù sao, thay vì ném bom, hãy thực hiện một cuộc tấn công chính xác, tức là lưu những gì bạn cần phục hồi sau khi khởi động lại và không có gì khác. /// 'JobInfo.Builder.setExtras' chỉ chấp nhận' PersistableBundle'. Vì vậy, nếu bạn tạo trực tiếp, bạn thậm chí không chạm vào 'Bundle' thông thường và không có gì để chuyển đổi. –

+0

Đây không phải là câu trả lời cho câu hỏi. –

+1

Đó là lý do tại sao nó là một bình luận. Tôi chỉ đảm bảo rằng bạn không giải quyết được vấn đề nhân tạo (một vấn đề không nên xảy ra ngay từ đầu). –

Trả lời

3

Tính đến API26, không có cách nào tiếp xúc dễ dàng làm được điều này, bạn phải tự xác minh rằng các giá trị tương thích:

private boolean bundleCanBePersisted(final Bundle extras) { 
    if (extras == null) { 
     return true; 
    } 

    Set<String> keys = extras.keySet(); 
    Iterator<String> it = keys.iterator(); 
    boolean allExtrasPersistable = true; 
    while (it.hasNext()) { 
     String key = it.next(); 
     boolean isPersistable = isPersistable(extras.get(key)); 

     if (!isPersistable) { 
      LOGGER.warning("Non persistable value in bundle. " + bundleItemToString(key, extras)); 
     } 

     allExtrasPersistable &= isPersistable; 
    } 
    return allExtrasPersistable; 
} 

/** 
* These are all the values that can be put into a PersistableBundle. 
*/ 
private boolean isPersistable(final Object o) { 
    return o == null 
      || o instanceof PersistableBundle 
      || o instanceof String 
      || o instanceof String[] 
      || o instanceof Boolean 
      || o instanceof Boolean[] 
      || o instanceof Double 
      || o instanceof Double[] 
      || o instanceof Integer 
      || o instanceof Integer[] 
      || o instanceof Long 
      || o instanceof Long[]; 
} 

private String bundleItemToString(final String key, final Bundle bundle) { 
    Object value = bundle.get(key); 
    Class<?> valueClazz = null; 
    if (value != null) { 
     valueClazz = value.getClass(); 
    } 
    return String.format("[%s = %s (%s)]", key, value, valueClazz); 
} 
Các vấn đề liên quan