android 怎么在activity 传递对象之间传递List 类型的数据

Android 学习之路一:Activity之间传递数据的四种方式
新建 Activity
在项目中右键,选择 New,继续选择中下方的 Activity,最后是 Blank Activity。
此时 Android Studio 会为我们自动添加一个对应的布局文件,为布局文件中的 TextView 添加 ID,以便后续使用。
新建 Activity
在项目中右键,选择 New,继续选择中下方的 Activity,最后是 Blank Activity。
此时 Android Studio 会为我们自动添加一个对应的布局文件,为布局文件中的 TextView 添加 ID,以便后续使用。
用Intent 发送数据
在主布局文件中新建一个 Button 控件,并在主类中定义它,然后为它设置 Click 的监听事件。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent i = new Intent(MainActivity.this,Main2Activity.class);
i.putExtra("Thanks","Thank you for reading my blog.");
startActivity(i);
用 Intent 接收数据
接下来再之前创建的 Activity 中同样新建一个 Intent 进行接受即可。和发送试用的 putExtra 类似,接受也可以用 getStringExtra 。当然了,正对不同的数据类型可以用不同的方法。
private TextV
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Intent i = getIntent();
tv = (TextView)findViewById(R.id.tv);
tv.setText(i.getStringExtra("Thanks"));
传递 Bundle 包
在两个 Activity 之间也可以用 Bundle 包来进行数据的传递,相比上一种方式,这一种可以包含更多的数据,你可以将其认为是一个集合,这也正符合“包”的概念。
新建 Bundle
Bundle 可以嵌套 Bundle
对 Intent 对象使用 putExtras 方法
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent i = new Intent(MainActivity.this,Main2Activity.class);
Bundle a = new Bundle();
a.putString("Thanks", "Thank you for reading my blog.");
Bundle b = new Bundle();
b.putString("Android","Google");
b.putString("Windows","Microsoft");
a.putBundle("bundle",b);
i.putExtras(a);
startActivity(i);
根据相应的 Key 值获取相应的Bundle数据
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
Intent i = getIntent()
Bundle a2 = i.getExtras()
tv = (TextView)findViewById(R.id.tv)
tv.setText(String.format("%s Android属于%s,Windows属于%s",
a2.getString("Thanks"),
a2.getBundle("bundle").getString("Android"),
a2.getBundle("bundle").getString("Windows")))
传递自定义对象
Android 开发过程中自然少不了“类”了,那么这种数据又如何传输呢。
切记:一定要执行序列化,即加上“implements Serializable”
public class Source implements Serializable{
private int
private String ID;
public int getSource() {
public void setSource(int source) {
this.source =
public String getID() {
return ID;
public void setID(String ID) {
this.ID = ID;
public Source(String ID, int source) {
this.source =
this.ID = ID;
相应有了前面的了解,大家都可以直接猜到如何使用了,那我就不再啰嗦了。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent i = new Intent(MainActivity.this,Main2Activity.class);
i.putExtra("source",new Source("Player",1000));
startActivity(i);
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
Intent i = getIntent()
Source s = (Source) i.getSerializableExtra("source")
tv = (TextView) findViewById(R.id.tv)
tv.setText(String.format("ID是%s,得分是%d",
s.getID(), s.getSource()))
从Activity返回数据
用户需要与应用进行交互,应用需要将用户输入的数据进行返回,所以……
在主 Activity 中定义 Button 和 TextView,前者用于导航至次 Activity , 后者用于显示返回的数据。
在次 Activity 中定义 Button 和 EditText,前者用于确认并返回至主 Activity,后者用于用户输入。
在次 Activity 中:
同样用 Intent 传递数据
用 setResult 设置返回结果
最后用 finish
private EditText editT
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
editText = (EditText)findViewById(R.id.editText);
button = (Button)findViewById(R.id.button2);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent i = new Intent();
i.putExtra("info",editText.getText().toString());
setResult(0, i);
在主 Activity 中:
用 startActivityForResult 进行导航,并请求结果
private TextView textV
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.textView);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent i = new Intent(MainActivity.this,Main2Activity.class);
startActivityForResult(i,0);
重载 onActivityResult 方法,并通过 data 参数获取数据。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
textView.setText(data.getStringExtra("info"));
好了,Activity 之间就是这么传递数据的……
我们用 startActivity 方法来启动一个新的被放到 activity 堆栈顶部的 Activity 。如果希望在一个 activity 结束时获得结果,就应该调用 startActivityForResult 方法,它的第二参数就是确认请求的请求码。而返回的结果也会通过 onActivityResult 来获取,如上代码所示,根据 Intent 获取数据。
零点半了……睡觉……
本文为重复文章,仅为测试。
本文为云栖社区原创内容,未经允许不得转载,如需转载请发送邮件至yqeditor@list.;如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:yqgroup@ 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】红轴机械键盘、无线鼠标等753个大奖,先到先得,云栖社区首届博主招募大赛9月21日-11月20日限时开启,为你再添一个高端技术交流场所&&
阿里云机器学习是基于阿里云分布式计算引擎的一款机器学习算法平台。用户通过拖拉拽的方式可视化的操作组件来进行试验,...
支持以数据库为核心的结构化存储产品之间的数据传输。 它是一种集数据迁移、数据订阅及数据实时同步于一体的数据传输服...
通过机器学习和数据建模发现潜在的入侵和攻击威胁,帮助客户建设自己的安全监控和防御体系,从而解决因网络攻击导致企业...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
MaxCompute75折抢购
Loading...Android五种传递参数的方法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Android五种传递参数的方法
&&Android项目开发数据传递必看文档
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩6页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢Android开发必看-详解Activity之间的数据传递 - 简书
Android开发必看-详解Activity之间的数据传递
Android开发必看-详解Activity之间的数据传递
Activity单向数据传递
下面的;例子演示了从 OriginActivity activity 传递字符串“some data!” 到DestinationActivity activity.注:这是两个活动之间发送数据的最直接的方法。
直接上代码(简单粗暴直接代码示例!)
OriginActivity
public class OriginActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_origin);
// Create a new Intent object, containing DestinationActivity as target Activity.
final Intent intent = new Intent(this, DestinationActivity.class);
// Add data in the form of key/value pairs to the intent object by using putExtra()
intent.putExtra(DestinationActivity.EXTRA_DATA, "Some data!");
// Start the target Activity with the intent object
startActivity(intent);
DestinationActivity
public class DestinationActivity extends AppCompatActivity {
public static final String EXTRA_DATA = "EXTRA_DATA";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_destination);
// getIntent() returns the Intent object which was used to start this Activity
final Intent intent = getIntent();
// Retrieve the data from the intent object by using the same key that
// was previously used to add data to the intent object in OriginActivity.
final String data = intent.getStringExtra(EXTRA_DATA);
其他的数据类型
对于其他的数据基本类型传递也是可以的,调用intent。putExtra(key,value);但是取值时候要注明相应类型,比如传入的String,取值时候是getStringExtra()以此类推。
有两种方式
Serializable
Serializable这种方式直接实现Serializable接口,剩下的系统会帮我们做好。
代码如下(简单粗暴直接代码示例!)
intent.putExtra(DestinationActivity.EXTRA_DATA, myParcelableObject);
bundle.putParcelable(DestinationActivity.EXTRA_DATA, myParcelableObject);
final MyParcelableType data = intent.getParcelableExtra(EXTRA_DATA);
Parcelable
Parcelable是一个Android特定的接口,可以对自定义数据类型实现的(即你自己的对象/ POJO对象)。它是Android提供的,比Serializable更加高效。
代码如下(简单粗暴直接代码示例!)
bundle.putSerializable(DestinationActivity.EXTRA_DATA, mySerializableObject);
final SerializableType data = (SerializableType)bundle.getSerializable(EXTRA_DATA);
Parcelable代码示例(依旧粗暴)
public class Foo implements Parcelable
private final int myFirstV
private final String mySecondV
private final long myThirdV
public Foo(int myFirstVariable, String mySecondVariable, long myThirdVariable)
this.myFirstVariable = myFirstV
this.mySecondVariable = mySecondV
this.myThirdVariable = myThirdV
// Note that you MUST read values from the parcel IN THE SAME ORDER that
// values were WRITTEN to the parcel! This method is our own custom method
// to instantiate our object from a Parcel. It is used in the Parcelable.Creator variable we declare below.
public Foo(Parcel in)
this.myFirstVariable = in.readInt();
this.mySecondVariable = in.readString();
this.myThirdVariable = in.readLong();
// The describe contents method can normally return 0. It's used when
// the parceled object includes a file descriptor.
public int describeContents()
public void writeToParcel(Parcel dest, int flags)
dest.writeInt(myFirstVariable);
dest.writeString(mySecondVariable);
dest.writeLong(myThirdVariable);
// Note that this seemingly random field IS NOT OPTIONAL. The system will
// look for this variable using reflection in order to instantiate your
// parceled object when read from an Intent.
public static final Parcelable.Creator&Foo& CREATOR = new Parcelable.Creator&Foo&()
// This method is used to actually instantiate our custom object
// from the Parcel. Convention dictates we make a new constructor that
// takes the parcel in as its only argument.
public Foo createFromParcel(Parcel in)
return new Foo(in);
// This method is used to make an array of your custom object.
// Declaring a new array with the provided size is usually enough.
public Foo[] newArray(int size)
return new Foo[size];
Activty之间传递数据并且返回
MainActivity向DetailActivity传递数据,并且等待返回,MainActivity需要重写 onActivityResult(int requestCode, int resultCode, Intent data)方法,其中requestCode用于唯一标识请求的是DetailActivity,resultCode代表是请求的状态
粗暴的代码示例
MainActivity:
public class MainActivity extends Activity {
// Use a unique request code for each use case
private static final int REQUEST_CODE_EXAMPLE = 0x9345;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create an Intent to start DetailActivity
final Intent intent = new Intent(this, DetailActivity.class);
// Start DetailActivity with the request code
startActivityForResult(intent, REQUEST_CODE_EXAMPLE);
// onActivityResult only get called
// when the other Activity previously started using startActivityForResult
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// First we need to check if the requestCode matches the one we used.
if(requestCode == REQUEST_CODE_EXAMPLE) {
// The resultCode is set by the DetailActivity
// By convention RESULT_OK means that whatever
// DetailActivity did was executed successfully
if(resultCode == Activity.RESULT_OK) {
// Get the result from the returned Intent
final String result = data.getStringExtra(DetailActivity.EXTRA_DATA);
// Use the data - in this case, display it in a Toast.
Toast.makeText(this, "Result: " + result, Toast.LENGTH_LONG).show();
// setResult wasn't successfully executed by DetailActivity
// Due to some error or flow of control. No data to retrieve.
DetailActivity:
public class DetailActivity extends Activity {
// Constant used to identify data sent between Activities.
public static final String EXTRA_DATA = "EXTRA_DATA";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
final Button button = (Button) findViewById(R.id.button);
// When this button is clicked we want to return a result
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
// Create a new Intent object as container for the result
final Intent data = new Intent();
// Add the required data to be returned to the MainActivity
data.putExtra(EXTRA_DATA, "Some interesting data!");
// Set the resultCode as Activity.RESULT_OK to
// indicate a success and attach the Intent
// which contains our result data
setResult(Activity.RESULT_OK, data);
// With finish() we close the DetailActivity to
// return back to MainActivity
public void onBackPressed() {
// When the user hits the back button set the resultCode
// as Activity.RESULT_CANCELED to indicate a failure
setResult(Activity.RESULT_CANCELED);
super.onBackPressed();
1.数据会立即返回,在调用finish()之后,所以setResult()方法需要在finish()之前调用,否否则数据不会返回。
2.确定你的Activity没有使用android:launchMode="singleTask”启动模式,否则他会在一个单独的task,这样数据也不会返回。如果你的Activity使用singleTask启动,那么会立即调用onActivityResult(),并且返回result code o是Activity.RESULT_CANCELED.
3.谨慎的使用android:launchMode="singleInstance”.在 Lollipop (Android 5.0, API Level 21)之前,不会返回数据。
帮朋友招聘职位如下
普照天星【Java开发工程师】20-30k产品经理20-30k
文章首发于公众号:《互联网学术》博客分类:
1.基于消息的通信机制
Intent ---boudle ,extra
数据类型有限,比如遇到不可序列化的数据Bitmap,InputStream, 或者LinkList链表等等数据类型就不太好用。
2. 利用static静态数据, public static成员变量;
3.基于外部存储的传输,
File/Preference/ Sqlite ,如果要针对第三方应用需要Content Provider
4.基于IPC的通信机制
context 与Service之间的传输,如Activity与Service之间的通信,定义AIDL接口文件。
5. 基于Application Context, 例子如下文:
在当前Activity将两个值传到了Test中。但如果遇到不可序列化的数据,如Bitmap、InputStream等,intent就无能为力了。因此,我们很自然地会想到另外一种方法,静态变量。如下面的代码所示:
对于上面的代码来说,其他任何类可以直接使用Product中的mBitmap变量。这么做很easy、也很cool,但却very very wrong。我们千万不要以为Davlik虚拟机的垃圾回收器会帮助我们回收不需要的内存垃圾。事实上,回收器并不可靠,尤其是手机上,是更加的不可靠。 因此,除非我们要使自己的程序变得越来越糟糕,否则尽量远离static。
注:如果经常使用static的Bitmap、Drawable等变量。可能就会抛出一个在Android系统中非常著名的异常(以前budget这个单词一直记不住什么意思,自从经常抛出这个异常后,这个单词终于烂熟于心了, )
ERROR/AndroidRuntime(4958): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
如果不使用static,总得有方法来代替它(尽管我很喜欢public static,我相信很多人也喜欢它,但为了我们的程序,建议还是忍痛割爱吧),那么这个新的解决方案就是本文的主题,这就是Application Context,相当于Web程序的Application,它的生命周期和应用程序一样长(这个我喜欢)。
那么现在来看看如何使用这个Application Context。我们可以通过Context.getApplicationContext或Context.getApplication方法获得 Application Context。但要注意,我们获得的只是Context对象,而更理想的方法是获得一个类的对象。ok,说干就干,下面来定义一个类。
net.blogjava.mobile1;
android.app.Aimport
android.graphics.B
Application{
Bitmap getBitmap()
setBitmap(Bitmap bitmap)
this .mBitmap
上面这个类和普通的类没什么本质的不同。但该类是Application的子类。对了,这就是使用Application Context的第一步,定义一个继承自Application的类。然后呢,就在这个类中定义任何我们想使其全局存在的变量了,如本例中的 Bitmap。下面还需要一个重要的步骤,就是在&application&标签中使用android:name属性来指定这个类,代码如 下:
& application
android:name =".MyApp"
android:icon ="@drawable/icon"
android:label ="@string/app_name" &
&/ application?
接下来的最后一步就是向MyApp对象中存入Bitmap对象,或从MyApp对象中取出Bitmap对象了,存入Bitmap对象的代码如下:
MyApp myApp
(MyApp)getApplication();
Bitmap bitmap
BitmapFactory.decodeResource( this .getResources(), R.drawable.icon);
myApp.setBitmap(bitmap);
获得Bitmap对象的代码:
ImageView imageview
(ImageView)findViewById(R.id.ivImageView);
MyApp myApp
(MyApp)getApplication();
imageview.setImageBitmap(myApp.getBitmap());
上面两段代码可以在任何的Service、Activity中使用。全局的。
1.http://flyvenus.net/?p=229
浏览: 172938 次
你这个程序一存在线程的时间片相互抢占的问题,运行时间长了很可能 ...
我觉得话应该这么说:引用TestThread tt = new ...
调用TelephonyManager的隐藏API是先参考Fra ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 android activity类型 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信