Java 是否可以通过广播接收器在Android应用程序之间传递自定义对象?
假设有两个Android应用程序A和B,B希望将Android应用程序A中定义的自定义对象传递给A中定义的广播接收器,广播接收器接收额外的内容并将其转换为自定义对象,如下所示Java 是否可以通过广播接收器在Android应用程序之间传递自定义对象?,java,android,android-intent,serialization,broadcastreceiver,Java,Android,Android Intent,Serialization,Broadcastreceiver,假设有两个Android应用程序A和B,B希望将Android应用程序A中定义的自定义对象传递给A中定义的广播接收器,广播接收器接收额外的内容并将其转换为自定义对象,如下所示 public void onReceive(Context-paramContext,Intent-Intent){ ... paramIntent=(CustomClass)intent.getSerializableExtra(“msg_bean”); 假设已导出广播接收器,我尝试在应用程序B中定义自定义类,以便在应用
public void onReceive(Context-paramContext,Intent-Intent){
...
paramIntent=(CustomClass)intent.getSerializableExtra(“msg_bean”);
假设已导出广播接收器,我尝试在应用程序B中定义自定义类,以便在应用程序B中实例化它并将其广播给接收器,如下所示:
CustomClass bean = new CustomClass ();
intent.putExtra("msg_bean", bean);
sendBroadcast(intent);
假设应用程序A有包A.b.c,b有包d.e.f,我得到了错误ClassDef not found:在应用程序b中找不到d.e.f.CustomClass,因为我发送给接收者的对象是路径d.e.f.CustomClass,因为它是在应用程序b中定义的。但是,应用程序A中定义的同一个CustomClass有路径A.b.c.CustomClass。有什么办法吗我可以手动定义对象bean的类路径,使其遵循应用程序A中的类路径?(A.b.c.CustomClass)如果您的对象实现了Parcelable或Serializable,您可以这样做,但是捆绑包的容量有限制。我认为限制是500kb或其他。您只需要在两个应用程序上实现对该对象中字段的解析和写入。
是的,您可以通过,您需要这样创建bean类:
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");
}
导入android.os.packet;
导入android.os.Parcelable;
公共类CustomClass实现了Parcelable{
私有字符串名称;
私有int缩略图;
公共自定义类(){
}
公共自定义类(字符串名称,int缩略图){
this.name=名称;
this.缩略图=缩略图;
}
受保护的自定义类(包裹中){
name=in.readString();
缩略图=in.readInt();
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的地书面记录(名称);
目标写入(缩略图);
}
@凌驾
公共int描述内容(){
返回0;
}
公共静态最终创建者=新创建者(){
@凌驾
公共CustomClass createFromParcel(地块中){
返回新的CustomClass(在中);
}
@凌驾
公共CustomClass[]新数组(整数大小){
返回新的CustomClass[大小];
}
};
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
public-int-getThumbNail(){
返回缩略图;
}
公共void集缩略图(int缩略图){
this.缩略图=缩略图;
}
}
=>如何在发送广播中调用意图:
CustomClass bean=新的CustomClass();
putExtra(“味精豆”,豆);
发送广播(意图);
=>如何在onReceive()方法中获取对象:
public void onReceive(Context-paramContext,Intent-Intent){
CustomClass bean=intent.getExtras().getParcelable(“msg_bean”);
}
创建一个库/模块,其中包含CustomClass
-在两个应用程序中添加为依赖项,则CustomClass
命名空间将保持一致,而不是类的两个版本。