是否可以通过广播接收器在 Android 个应用程序之间传递自定义对象?
Is it possible to pass custom objects between Android apps through broadcast receivers?
假设有 2 个 Android 应用程序,A 和 B,B 希望将 Android 应用程序 A 中定义的自定义对象传递给 A 中定义的广播接收器,它接受一个额外的并将其转换为自定义对象,如下所示。
public void onReceive(Context paramContext, Intent intent){
...
paramIntent = (CustomClass)intent.getSerializableExtra("msg_bean");
假设广播接收器已导出,我尝试在 App B 中定义自定义 class,以便我可以在 B 中实例化它并像这样将其广播到接收器:
CustomClass bean = new CustomClass ();
intent.putExtra("msg_bean", bean);
sendBroadcast(intent);
假设 App A 有包 a.b.c 并且 B 有包 d.e.f,我得到错误 ClassDef not found:d.e.f.CustomClass not found in App B,因为我发送给接收者的对象是路径 d.e.f.CustomClass,因为它是在 App B 中定义的。但是,在 App A 中定义的同一个 CustomClass 的路径是 a.b.c.CustomClass。有什么方法可以手动定义对象 bean 的 class 路径,使其遵循 App A 中的 class 路径?(a.b.c.CustomClass)
如果您的对象实现了 Parcelable 或 Serializable,则可以,但是 Bundle 可以容纳多少是有限制的。我认为限制是 500kb 左右。您只需要在两个应用程序上实现该对象中字段的解析和写入。
Yes you can pass you need to create your bean class like this:
import android.os.Parcel;
import android.os.Parcelable;
public class CustomClass implements Parcelable {
private String name;
private int thumbNail;
public CustomClass() {
}
public CustomClass(String name, int thumbnail) {
this.name = name;
this.thumbNail = thumbnail;
}
protected CustomClass(Parcel in) {
name = in.readString();
thumbNail = in.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(thumbNail);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<CustomClass> CREATOR = new Creator<CustomClass>() {
@Override
public CustomClass createFromParcel(Parcel in) {
return new CustomClass(in);
}
@Override
public CustomClass[] newArray(int size) {
return new CustomClass[size];
}
};
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getThumbNail() {
return thumbNail;
}
public void setThumbNail(int thumbNail) {
this.thumbNail = thumbNail;
}
}
=> how to call intent in send broadcast:
CustomClass bean = new CustomClass();
intent.putExtra("msg_bean", bean);
sendBroadcast(intent);
=> How to get object in onReceive() method:
public void onReceive(Context paramContext, Intent intent) {
CustomClass bean = intent.getExtras().getParcelable("msg_bean");
}
假设有 2 个 Android 应用程序,A 和 B,B 希望将 Android 应用程序 A 中定义的自定义对象传递给 A 中定义的广播接收器,它接受一个额外的并将其转换为自定义对象,如下所示。
public void onReceive(Context paramContext, Intent intent){
...
paramIntent = (CustomClass)intent.getSerializableExtra("msg_bean");
假设广播接收器已导出,我尝试在 App B 中定义自定义 class,以便我可以在 B 中实例化它并像这样将其广播到接收器:
CustomClass bean = new CustomClass ();
intent.putExtra("msg_bean", bean);
sendBroadcast(intent);
假设 App A 有包 a.b.c 并且 B 有包 d.e.f,我得到错误 ClassDef not found:d.e.f.CustomClass not found in App B,因为我发送给接收者的对象是路径 d.e.f.CustomClass,因为它是在 App B 中定义的。但是,在 App A 中定义的同一个 CustomClass 的路径是 a.b.c.CustomClass。有什么方法可以手动定义对象 bean 的 class 路径,使其遵循 App A 中的 class 路径?(a.b.c.CustomClass)
如果您的对象实现了 Parcelable 或 Serializable,则可以,但是 Bundle 可以容纳多少是有限制的。我认为限制是 500kb 左右。您只需要在两个应用程序上实现该对象中字段的解析和写入。
Yes you can pass you need to create your bean class like this:
import android.os.Parcel;
import android.os.Parcelable;
public class CustomClass implements Parcelable {
private String name;
private int thumbNail;
public CustomClass() {
}
public CustomClass(String name, int thumbnail) {
this.name = name;
this.thumbNail = thumbnail;
}
protected CustomClass(Parcel in) {
name = in.readString();
thumbNail = in.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(thumbNail);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<CustomClass> CREATOR = new Creator<CustomClass>() {
@Override
public CustomClass createFromParcel(Parcel in) {
return new CustomClass(in);
}
@Override
public CustomClass[] newArray(int size) {
return new CustomClass[size];
}
};
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getThumbNail() {
return thumbNail;
}
public void setThumbNail(int thumbNail) {
this.thumbNail = thumbNail;
}
}
=> how to call intent in send broadcast:
CustomClass bean = new CustomClass();
intent.putExtra("msg_bean", bean);
sendBroadcast(intent);
=> How to get object in onReceive() method:
public void onReceive(Context paramContext, Intent intent) {
CustomClass bean = intent.getExtras().getParcelable("msg_bean");
}