我想编组和解组一个实现Parcelable/来自字节数组的类.我很清楚Parcelable表示不稳定,因此不适用于实例的长期存储.但我有一个用例,我需要序列化一个对象,如果由于内部Android更改而解组失败,它不是一个showstopper.该类已经在实现该Parcelable接口.
给定一个类MyClass implements Parcelable,我如何(ab)使用Parcelable接口进行编组/解组?
这是我的模型类:
public enum Action {
RETRY, SETTINGS
}
private int imageId;
private String description;
private String actionName;
private Action action;
public NetworkError(int imageId, String description, String actionName, Action action ) {
this.imageId = imageId;
this.description = description;
this.actionName = actionName;
this.action = action;
}
public int getImageId() {
return imageId;
}
public void setImageId(int imageId) {
this.imageId = imageId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getActionName() { …Run Code Online (Sandbox Code Playgroud) 所以我让我的AccessibilityService使用以下代码:
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
List<CharSequence> notificationList = event.getText();
for (int i = 0; i < notificationList.size(); i++) {
Toast.makeText(this.getApplicationContext(), notificationList.get(i), 1).show();
}
}
}
Run Code Online (Sandbox Code Playgroud)
它可以很好地读出创建通知时显示的文本(1).

唯一的问题是,我还需要在用户打开通知栏时显示的值(3).(2)对我来说并不重要,但知道如何阅读它会很好.您可能知道,所有值都可能不同.

那么,我怎么读出来(3)?我怀疑这是不可能的,但我notificationList似乎只有一个条目(至少只显示一个吐司).
非常感谢!
/ edit:我可以使用提取通知包裹
if (!(parcel instanceof Notification)) {
return;
}
final Notification notification = (Notification) parcel;
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何从/ notification或中提取通知的消息.notification.contentViewnotification.contentIntent
有任何想法吗?
/编辑:澄清这里的问题:我如何读出(3)?
如果我试着写
Car myCarObject=getCar();
Intent details = new Intent(Start.this, DetailsCar.class);
details.putExtra("Car", myCarObject);
startActivity(details);
Run Code Online (Sandbox Code Playgroud)
Eclipse向我展示了一行编译错误"方法放置额外对于类型Intent是不明确的"
details.putExtra("Car", myCarObject);
Run Code Online (Sandbox Code Playgroud)
如果我使用代码
Car myCarObject=getCar();
ArrayList<Car> parcelableExtra = new ArrayList<Car>();
parcelableExtra.add(myCarObject);
Intent details = new Intent(Start.this, DetailsCar.class);
details.putExtra("Car", parcelableExtra);
startActivity(dettagli);
Run Code Online (Sandbox Code Playgroud)
我尝试在目标Intent中加载额外的代码
ArrayList<Car> parcelableExtra = new ArrayList<Car>();
parcelableExtra = (ArrayList<Car>) getIntent().getExtras().getParcelable("Car");
Car c=parcelableExtra.get(0);
Run Code Online (Sandbox Code Playgroud)
我收到了这个警告
12-14 05:30:07.669: W/Bundle(19823): Key Car expected Parcelable but value was a java.util.ArrayList. The default value <null> was returned.
12-14 05:30:07.679: W/Bundle(19823): Attempt to cast generated internal exception:
12-14 05:30:07.679: W/Bundle(19823): java.lang.ClassCastException: java.util.ArrayList
12-14 …Run Code Online (Sandbox Code Playgroud) 我正在点击一个返回JSON数据的外部API(新的dvd标题).我能够解析出JSON并将每个DVD标题和其他DVD信息列入ListView就好了.我还能够为原始数据(标题字符串)设置一个onListItemClick方法.我最终为onListItemClick方法写了类似的东西:
需要注意的是,productArray是一个类var,由另一个包含JSONObject数组的方法设置.
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Intent i = new Intent(DvdListingActivity.this, MovieProductActivity.class);
try {
JSONObject jsonObj = productArray.getJSONObject(position);
i.putExtra("mTitle", jsonObj.getJSONObject("Title").opt("val").toString());
i.putExtra("mRelDate", jsonObj.getJSONObject("RelDate").opt("val").toString());
i.putExtra("mDesc", jsonObj.getJSONObject("Desc").opt("val").toString());
i.putExtra("mRating", jsonObj.getJSONObject("MPAA").getJSONObject("Rating").opt("val").toString());
i.putExtra("mActors", jsonObj.getJSONObject("Actors").opt("val").toString());
i.putExtra("mImage", jsonObj.getJSONObject("Image").opt("val").toString());
startActivity(i);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码都有效,但我认为GOTTA是一种更好的方式让我将数据传递给另一个Activity.我以为我能够传递一个包含dvd影片所有数据的JSONObject,而不是单独设置每个数据点.
我尝试了一个半星期来弄清楚如何使用Parcelable.我尝试实例化一个新的JSONObject jsonObj,它实现了Parcelable而没有运气.我一直在我的LogCat中收到错误,该错误表示该对象是不可分割的.
我已经尝试过阅读Android开发者网站和其他博客,但我无法将他们的示例应用到我需要做的事情上.
任何帮助将非常感激
我想让A级Parcelable.
public class A {
public String str;
public ArrayList<B> list;
}
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所提出的.但是它崩溃了NullPointerException.问题是这两个陈述:dest.writeList(list);&in.readList(list, this.getClass().getClassLoader());.我无法弄清楚从这里做什么:(
A级
public class A implements Parcelable {
public String str;
public ArrayList<B> list;
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(str);
dest.writeList(list);
}
private A(Parcel in) {
str = in.readString();
in.readList(list, this.getClass().getClassLoader());
}
public static final Parcelable.Creator<A> CREATOR
= new Parcelable.Creator<A>() {
public A createFromParcel(Parcel in) {
return …Run Code Online (Sandbox Code Playgroud) 谁能解释一下如何迁移到新的 kotlin-parcelize?
我试过:
apply plugin: 'kotlin-android-extensions'为apply plugin: 'kotlin-parcelize'import kotlinx.android.parcel.Parcelize为import kotlinx.parcelize.Parcelize后者导致
Class 'ParcelZonedDateTime' is not abstract and does not implement abstract member public abstract fun describeContents(): Int defined in android.os.Parcelable
Run Code Online (Sandbox Code Playgroud)
例如,在此代码上:
import androidx.annotation.Keep
import kotlinx.parcelize.Parcelize
import org.threeten.bp.ZonedDateTime
@Keep
@Parcelize
data class ParcelZonedDateTime(var value: ZonedDateTime?) :Parcelable {
override fun toString(): String {
return value.toString()
}
}
Run Code Online (Sandbox Code Playgroud)
那么,如何迁移到新的kotlin-parcelize?
更新:
基于评论:是的,我使用的是 Kotlin 1.4.20(比 1.4.20-M2 更新)。Kyzer 是正确的,IDE 中的错误(不是抽象的并且没有实现抽象成员 public …
到目前为止,我已经看到了许多可以说明的例子,但由于某种原因,当它变得有点复杂时,我无法让它工作.我有一个Movie对象,它实现了Parcelable.此book对象包含一些属性,例如ArrayLists.在执行ReadTypedList时,运行我的应用程序会导致NullPointerException!我真的没有想法
public class Movie implements Parcelable{
private int id;
private List<Review> reviews
private List<String> authors;
public Movie () {
reviews = new ArrayList<Review>();
authors = new ArrayList<String>();
}
public Movie (Parcel in) {
readFromParcel(in);
}
/* getters and setters excluded from code here */
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeList(reviews);
dest.writeStringList(authors);
}
public static final Parcelable.Creator<Movie> CREATOR = new Parcelable.Creator<Movie>() {
public MoviecreateFromParcel(Parcel source) {
return new Movie(source);
}
public Movie[] newArray(int size) {
return new Movie[size]; …Run Code Online (Sandbox Code Playgroud) 我在Android崩溃报告中看到以下错误:
android.os.BadParcelableException: ClassNotFoundException when unmarshalling: android.support.v4.view.ViewPager$SavedState
at android.os.Parcel.readParcelable(Parcel.java:1971)
at android.os.Parcel.readValue(Parcel.java:1859)
at android.os.Parcel.readSparseArrayInternal(Parcel.java:2128)
at android.os.Parcel.readSparseArray(Parcel.java:1581)
at android.os.Parcel.readValue(Parcel.java:1916)
at android.os.Parcel.readMapInternal(Parcel.java:2099)
at android.os.Bundle.unparcel(Bundle.java:223)
at android.os.Bundle.getSparseParcelableArray(Bundle.java:1225)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:806)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:635)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1431)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:160)
at android.support.v4.view.ViewPager.populate(ViewPager.java:895)
at android.support.v4.view.ViewPager.populate(ViewPager.java:772)
at android.support.v4.view.ViewPager.completeScroll(ViewPager.java:1539)
at android.support.v4.view.ViewPager.computeScroll(ViewPager.java:1422)
at android.view.ViewGroup.drawChild(ViewGroup.java:3028)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788)
at android.view.ViewGroup.drawChild(ViewGroup.java:3184)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788)
at android.view.ViewGroup.drawChild(ViewGroup.java:3184)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788)
at android.view.ViewGroup.drawChild(ViewGroup.java:3184)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788)
at android.view.View.draw(View.java:11017)
at android.widget.FrameLayout.draw(FrameLayout.java:450)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2175)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2234)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1810)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2695)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:4977)
at java.lang.reflect.Method.invokeNative(Native Method)
at …Run Code Online (Sandbox Code Playgroud) 我想知道确切的,
parcelable还是serialization技术将数据从一个活动发送到另一个活动?提前致谢.
public class GetSetClass implements Serializable {
private int dt = 10;
/** pass any object, drwabale */
public int getDt() {
return dt;
}
public void setDt(int dt) {
this.dt = dt;
}
}
Run Code Online (Sandbox Code Playgroud) android ×10
parcelable ×10
parcel ×2
arraylist ×1
enums ×1
java ×1
kotlin ×1
marshalling ×1
serializable ×1
typed ×1