Ⅰ android两个activity之间传值
Activity之间是没有办法直接传递数据的。Android的设计原则是,用Intent在不同的Activity和进程之间进行通信,但是通常来讲,Intent中只能存入基本数据类型和系统默认支持的比如Uri之类的。那么对于用户自己定义的数据结构是无法直接用Intent来传送的,如果想要通过Intent来传递自定义数据,可以让数据结构实现Parcelable接口,这样就可以把数据放入Intent。但是Intent的传送效率也不是很高,特别是当传递一些如Bitmap的大数据,用Intent传递超过500K的Bitmap,就会造成Framework层的java Binder挂掉,结果就是传递不成功。
这点可以算成是Android的一个弊端,没有很好的解决方案。能做到的就是尽量设计的时候注意,尽量让Activity之间共享基本数据类型。
Android本身的应用中也深受其害,可以看到有很多应用程序的源代码中的主要的类在三千行以上的不在少数,比如Browser中的BrowserActivity有四千多行;Mms中的ComposeMessageActivity也有四千多行,等等。为什么一个类会如此之大,就是因为它们是程序的主页面,是业务的核心逻辑所在,里面也控制着很多的其他的数据结构,而又无法与另外的Activity共享,所以就只能在一个Activity里面做所的事情。
Ⅱ Android Intent传递数据时key使用静态常量
首先静态常量是要占内存的,但是正常开发中,该占就要占。其实,静态常量在APP启动后就存在,要回收也是先回收其他的变量。真到了回收静态常量的时候,应该是你的手机内存不足崩溃了
Ⅲ android intent 传数据问题,能否确定传入的数据来自哪个activity
完全可以,只需要往intent里面添加一个标识数据即可
//两个activity
//第一个activity
{
privateButtonbtn;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
Intentintent=newIntent(OneActivity.this,EditActivity.class);
intent.putExtra("from",1);
startActivity(intent);
}
});
}
}
//第二个activity
{
privateButtonbtn;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
Intentintent=newIntent(OneActivity.this,EditActivity.class);
intent.putExtra("from",2);
startActivity(intent);
}
});
}
}
编辑activity,判断intent传进来的from数据,为1即为OneActivity,2为TwoActivity
{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intentintent=getIntent();
intfrom=intent.getIntExtra("from",0);
switch(from){
case1:
//OneActivity
break;
case2:
//TwoActivity
break;
//case.......
}
}
}
Ⅳ android intent跳转怎样传输大数据
在Activity或者组件之前传递信息时,一般采用intent绑定bundle的方式传值,但在使用过程中需要注意的是不要用bundle传递大容量数据:
在做项目的过程中,需要将听写界面的听写结果信息传递到听写记录界面供显示用,但是由于传递的数据量过大导致程序ANR,甚至直接报异常(传递的信息里面有bitmap转换成的byte数组、每一个词组的拼音、词语、语音信息),经过分析发现是由于bundle不能传递大容量的数据信息,在stackoverflow里面查阅发现有同行遇到类似的问题:
(1)“The size limit of Intent is still pretty low in Jelly Bean, which is somewhat lower than 1MB (around 90K), so you should always be cautious about your data length, even if your application targets only latest Android versions.”
(2)“As per my experience (sometime ago), you are able to put up to 1MB of data in a Bundleencapsulated inside Intent. I think, this restriction was valid up till Froyo or GingerBread.”
所以在通过bundle传递数据时只能传递较小的数据信息,对于在不同组件之间需要传递大容量数据的情况时,有几种替代方式可以解决不能用bundle传递这些数据的问题:
方法一:将需要传递的数据写在临时文件或者数据库中,再跳转到另外一个组件的时候再去读取这些数据信息,这种处理方式会由于读写文件较为耗时导致程序运行效率较低;
方法二:将需要传递的数据信息封装在一个静态的类中(注意当前组件和要跳转到的组件必须属于同一个进程,因为进程之间才能够共享数据),在当前组件中为类设置内容,然后再跳转到的组件中去取,这种处理方式效率很高,但是会破坏程序的独立性。
具体采用哪种替代方式取决于具体的情况,本人建议采取第二种处理方式,因为这样会大大提高程序的运行效率,至于程序的独立性,看你怎么去封装这个类了。
Ⅳ Android Intent传递大量数据造成页面卡顿,闪退的解决方案
我们知道在Activity间使用Intent传递List含有大量序列化的对象的时候,或者传递较大bitmap等较大量数据的时候会引起页面卡顿。而且Android本身也限制了能够传递的数据大小在1MB左右。这就要求我们不得不为传输大量数据寻求一个解决方法。
通常我们可以想到的一个方法是当从A页面跳转至B页面的时候将需要传递的大对象赋值给A页面的一个静态变量,在B页面去取A页面的值。这种方式简单却有很多问题,比如可能会有很多其他页面访问B页面这会导致静态变量管理混乱,而且如果在组件化开发的过程中,需要进行组件间跳转的时候只能把这种静态变量写在BaseLibrary中,这显然是不够友好的。
我们稍加处理做一个简单的封装。++参考:《Android工程化最佳实践》++
就这样简单的两个类我们就完成了封装,可以看到在Model中序列化了一个int值。下面我们来看一个简单的使用示例:
通过以上方式的封装,可以看到无论需要序列化传递的对象有多大,在传值的时候只是传递了一个“int”而已。使用该这种方法时需要注意的一点是在数据的接收页面只能使用getIntent()获取一次该对象的值,因为我们在取完一次值后便将该对象从缓存区移除了。
Ⅵ intent传递数据时可以传递哪些类型的数据
在android应用的开发中,如果我们需要在不同的模块(比如不同的activity之间)之间传递数据,通常有以下两种方法:
1.
利用intent对象携带数据
通过查询intent/bundle的api文档,我们可以获知,intent/bundle支持传递基本类型的数据和基本类型的数组数据,以及string/charsequence类型的数据和string/charsequence类型的数组数据。而对于其它类型的数据貌似无能为力,其实不然,我们可以在intent/bundle的api中看到intent/bundle还可以传递parcelable(包裹化,邮包)和serializable(序列化)类型的数据,以及它们的数组/列表数据。
所以要让非基本类型和非string/charsequence类型的数据通过intent/bundle来进行传输,我们就需要在数据类型中实现parcelable接口或是serializable接口。
1.1
利用parcelable接口实现数据通过intent/bundle进行传递
/**
*
代表一个人的信息
*
@author
gansc
*/
public
class
personinfo
implements
parcelable
{
public
string
iname;
//
人名
publicint
isex;
//
性别
public
string
iid;
//
身份证号码
public
string
imobilenumber;
//
手机号码
public
string
iemailaddr;
//
邮箱地址
//
from
parcelable
@override
publicint
describecontents()
{
return0;
}
//
from
parcelable
//
保存到包裹中
@override
publicvoid
writetoparcel(parcel
dest,
int
flags)
{
dest.writestring(iname);
dest.writeint(isex);
dest.writestring(iid);
dest.writestring(imobilenumber);
dest.writestring(iemailaddr);
}
//
实现parcelable接口的类型中,必须有一个实现了parcelable.creator接口的静态常量成员字段,
//
并且它的名字必须为creator的
publicstaticfinal
parcelable.creator
creator
=new
parcelable.creator
()
{
//
from
parcelable.creator
@override
public
personinfo
createfromparcel(parcel
in)
{
personinfo
brief
=new
personinfo();
//
从包裹中读出数据
brief.iname
=
in.readstring();
brief.isex
=
in.readint();
brief.iid
=
in.readstring();
brief.imobilenumber
=
in.readstring();
brief.iemailaddr
=
in.readstring();
return
brief;
}
//
from
parcelable.creator
@override
public
personinfo[]
newarray(int
size)
{
returnnew
personinfo[size];
}
};
}
Ⅶ intent可以传递哪些类型数据类型
在Android应用的开发中,如果我们需要在不同的模块(比如不同的Activity之间)之间传递数据,通常有以下两种方法:
1. 利用Intent对象携带数据
通过查询Intent/Bundle的API文档,我们可以获知,Intent/Bundle支持传递基本类型的数据和基本类型的数组数据,以及String/CharSequence类型的数据和String/CharSequence类型的数组数据。而对于其它类型的数据貌似无能为力,其实不然,我们可以在Intent/Bundle的API中看到Intent/Bundle还可以传递Parcelable(包裹化,邮包)和Serializable(序列化)类型的数据,以及它们的数组/列表数据。
所以要让非基本类型和非String/CharSequence类型的数据通过Intent/Bundle来进行传输,我们就需要在数据类型中实现Parcelable接口或是Serializable接口。
1.1 利用Parcelable接口实现数据通过Intent/Bundle进行传递
/**
* 代表一个人的信息
* @author gansc
*/
public class PersonInfo implements Parcelable
{
public String iName; // 人名
publicint iSex; // 性别
public String iId; // 身份证号码
public String iMobileNumber; // 手机号码
public String iEMailAddr; // 邮箱地址
// From Parcelable
@Override
publicint describeContents()
{
return0;
}
// From Parcelable
// 保存到包裹中
@Override
publicvoid writeToParcel(Parcel dest, int flags)
{
dest.writeString(iName);
dest.writeInt(iSex);
dest.writeString(iId);
dest.writeString(iMobileNumber);
dest.writeString(iEMailAddr);
}
// 实现Parcelable接口的类型中,必须有一个实现了Parcelable.Creator接口的静态常量成员字段,
// 并且它的名字必须为CREATOR的
publicstaticfinal Parcelable.Creator<PersonInfo> CREATOR
=new Parcelable.Creator<PersonInfo>()
{
// From Parcelable.Creator
@Override
public PersonInfo createFromParcel(Parcel in)
{
PersonInfo brief =new PersonInfo();
// 从包裹中读出数据
brief.iName = in.readString();
brief.iSex = in.readInt();
brief.iId = in.readString();
brief.iMobileNumber = in.readString();
brief.iEMailAddr = in.readString();
return brief;
}
// From Parcelable.Creator
@Override
public PersonInfo[] newArray(int size)
{
returnnew PersonInfo[size];
}
};
}