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()之类的数据传递,但
是专门用于URI的李>.setData
是否有这样一种方法可以将整个提供者作为额外提供者传递,然后在下一个活动中获得提供者? 提前谢谢
编辑 我已经按照@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);