Store ArrayList<PendingIntent> into SharedPreferences

百般思念 提交于 2019-12-11 02:49:16

问题


II couldn't find an answer for my problem so I decided to post a question. The question is simple.

How can I store an ArrayList<PendingIntent> into SharedPreferences? What is the best way, do i have to use some kind of Serialization?

Thank you in advance, any advice would be great!


回答1:


PendingIntent is created with getActivity(), getBroadcast() or getService(). Each of these functions has the same list of parameters:

(Context context, int requestCode, Intent intent, @Flags int flags)

You cannot save Context, but you can save:

  • Type of PendingIntent (i.e. "Activity", "Broadcast" or "Service")
  • Request code and flags (integers)
  • Intent (using its toUri() method that returns String)

Thus, you can save in SharedPreferences all data that represents your PendingIntent, excluding Context (but Context instance is always available in your application.). Then you can easily restore saved PendingIntent from this data (using parseUri() method for restoring Intent).




回答2:


PendingIntent implements Parcelable. You'll need to loop through your ArrayList and convert each PendingIntent into a String. You can then concatenate all the individual Strings into a single String (with some delimiter in between each one). Then write the resulting String to SharedPreferences.

You can convert a Parcelable into a byte[] like this:

PendingIntent pendingIntent = // Your PendingIntent here
Parcel parcel = Parcel.obtain(); // Get a Parcel from the pool
pendingIntent.writeToParcel(parcel, 0);
byte[] bytes = parcel.marshall();
parcel.recycle(); // Return the Parcel to the pool

Now convert the byte[] to a String by using base64 encoding (or any other mechanism, like converting each byte into 2 hexadecimal digits). To use base64 you can do this:

String base64String = Base64.encodeToString(bytes, Base64.NO_WRAP | Base64.NO_PADDING);

See How to marshall and unmarshall a Parcelable to a byte array with help of Parcel? for more information about how to convert a Parcelable to byte[] and vice-versa.




回答3:


From AndroidSolution4u

//suppos you have already an arraylist like this

ArrayList<String> myArrayList=new ArrayList<String>();
myArrayList.add("value1");
myArrayList.add("value2");
myArrayList.add("value3");
myArrayList.add("value4");
myArrayList.add("value5");
myArrayList.add("value6");

Store arraylist in sharedpreference

SharedPreference sPrefs=PreferenceManager.getDefaultSharedPreferences(context);
SharedPreference.Editor sEdit=sPrefs.edit();

for(int i=0;i<myArrayList.size();i++)
{
     sEdit.putString("val"+i,myArrayList.get(i);
}
sEdit.putInt("size",myArrayList.size());
sEdit.commit();

Retrive arraylist from sharedpreference

I am retriving values in another arraylist

 ArrayList<String> myAList=new ArrayList<String>();
 int size=sPrefs.getInt("size",0);

 for(int j=0;j<size;j++)
 {
      myAList.add(sPrefs.getString("val"+j));
 }

EDIT

I am not sure but this may help you.



来源:https://stackoverflow.com/questions/18672035/store-arraylistpendingintent-into-sharedpreferences

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!