Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.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 作为额外目的传递提供程序_Java_Android_Android Intent_Android Contentprovider_Extras - Fatal编程技术网

Java 作为额外目的传递提供程序

Java 作为额外目的传递提供程序,java,android,android-intent,android-contentprovider,extras,Java,Android,Android Intent,Android Contentprovider,Extras,我有一个供应商,它拥有相当数量的财产。例如: public MyProvider( byte[] image, String firstName, String nickName, String lastName, String hairColor, String favoriteFood, String favoriteColor, String cityBorn, String stateBorn, long favoriteNumber, int

我有一个供应商,它拥有相当数量的财产。例如:

public MyProvider(
  byte[] image,
  String firstName,
  String nickName,
  String lastName,
  String hairColor,
  String favoriteFood,
  String favoriteColor,
  String cityBorn,
  String stateBorn,
  long favoriteNumber,
  int age,
  String nameOfFather,
  String nameOfMother,
  String nameOfBestFriend
)
我知道我可以得到每个属性的值,并将每个属性设置为额外属性,如下所示:

Intent myIntent = new Intent(firstActivity.this, secondActivity.class);
myIntent.putExtra("firstName", myProvider.getFirstName().toString());
myIntent.putExtra("nickName", myProvider.getNickName().toString());
...
firstActivity.this.startActivity(myIntent);

我只想将整个提供者作为额外的传递,然后能够在下一个活动中获得提供者。我知道在Swift中可以做这样的事情,但我不知道如何在Android Studio的Java中做到这一点

我希望能够做到以下几点:

MyProvider newPerson = new MyProvider(image, firstName, nickName, lastName, hairColor, favoriteFood, favoriteColor, cityBorn, stateBorn, favoriteNumber, age, nameOfFather, nameOfMother, nameOfBestFriend);
intent.putExtra(newPerson);
但似乎无法像这样传递提供者(或者根本无法传递?)

备选方案:

  • 我还尝试将其作为URI()之类的数据传递,但
    .setData
    是专门用于URI的

是否有这样一种方法可以将整个提供者作为额外提供者传递,然后在下一个活动中获得提供者?

提前谢谢


编辑

我已经按照@nabinhandari和@juancruzzoler的建议实现了
Parcelable
,但它导致了以下错误:

无法解析构造函数“MyProvider(字节[],java.lang.String,long)”

当我打电话时:

 MyApartmentsProvider newApartment = new MyApartmentsProvider(image, firstName, favoriteNumber); 
我更新的
MyProvider.java
如下:

(注意:我暂时删除了一些变量,以使示例更易于使用)

导入android.os.packet;
导入android.os.Parcelable;
公共类MyProvider实现了Parcelable{
/////////////////////////
//初始化者
字节[]图像;
字符串名;
长偏爱数;
//[初始值设定者]的结尾
/////////////////////////
/////////////////////////
//吸气剂
公共字节[]getImage(){
返回图像;
}
公共字符串getFirstName(){
返回名字;
}
公共长getFavoriteNumber(){
返回favoriteNumber;
}
//[getter]的结尾
/////////////////////////
/////////////////////////
//二传手
public void setImage(字节[]图像){
这个图像=图像;
}
public void setFirstName(字符串firstName){
this.firstName=firstName;
}
公共无效集合favoriteNumber(长favoriteNumber){
this.favoriteNumber=favoriteNumber;
}
//结束[设定者]
/////////////////////////
公共MyProvider(){
超级();
}
公共MyProvider(包裹){
image=新字节[parcel.readInt()];
包裹readByteArray(图像);
this.firstName=parcel.readString();
this.favoriteNumber=parcel.readLong();
}
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效书面包裹(包裹,内部i){
包裹写入(图像长度);
parcel.writeByteArray(图像);
包裹。笔迹(此。名字);
包裹。写长(此。收藏编号);
}
公共静态最终创建者=新创建者(){
@凌驾
公共MyProvider createFromParcel(地块){
返回新的MyProvider(包裹);
}
@凌驾
公共MyProvider[]新数组(int i){
返回新的MyProvider[i];
}
};
}

使您的
提供者
类实现接口
可序列化
可打包

Parcelable
更快,但
Serializable
更容易实现

发送:

intent.putExtra(KEY, yourObj);
接收:

Provider provider = (Provider) getIntent().getSerializableExtra(KEY);

您的类应该实现
Parcelable
,然后您可以将其传递到意图“然后能够在下一个活动中获取提供者”——使用
Parcelable
,您可以在下一个活动中获取提供者的副本(或者如果
Parcelable
太大,您可能会崩溃)。或者,您可以实现一个更好的应用程序体系结构,在这个体系结构中,两个活动都可以访问提供程序实例,而无需复制它(例如,带有缓存的存储库)。@commonware,对于可序列化的
是否也存在同样的问题?是的。
Intent
extras中没有传递引用,原因很简单,每个
startActivity()
调用都涉及IPC,即使调用
startActivity()
的活动与正在启动的活动恰好处于同一进程中。谢谢,@commonware。这有助于我们在讲话时了解如何使用parcelable!我已经实现了Parcelable,但现在在尝试初始化新的提供程序时,它导致了
无法解析构造函数的错误。你明白为什么吗?你可能把代码弄乱了,只需使用
Serializable
你不需要实现额外的方法。@nabinhandari我已经发布了我的代码并缩短了它,这样就不太容易通读了。你介意看看我上面的编辑吗?我不知道如何使用
Parcelable
为什么你不直接使用
Serializable
Provider provider = (Provider) getIntent().getSerializableExtra(KEY);