Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以通过广播接收器在Android应用程序之间传递自定义对象?_Java_Android_Android Intent_Serialization_Broadcastreceiver - Fatal编程技术网

Java 是否可以通过广播接收器在Android应用程序之间传递自定义对象?

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中定义自定义类,以便在应用

假设有两个Android应用程序A和B,B希望将Android应用程序A中定义的自定义对象传递给A中定义的广播接收器,广播接收器接收额外的内容并将其转换为自定义对象,如下所示

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
命名空间将保持一致,而不是类的两个版本。