使用Intent数据传递实用五部曲
2016-06-02 20:36
302 查看
(一)使用Intent对象进行数据传递
方法步骤:
1.在源Activity中new一个Intent对象,并调用它的putExpra()方法写入要传递的数据;
2. Intent对象调用它的setClass(源Activity.this , 目标Activity.class) 告诉Intent对象要传递到哪里,然后,startActivity(mIntent);
3. 然后在目标Activity中声明Intent对象并将getIntent()赋值给它,有点类似于网络通信中的Secoket套接字,然后,调用getXXXExpra()方法获取保存的数据的方法来实现Intent数据传递;
4. 源码如下:
MainActivity.java
目标Activity————-OtherActivity.java
(二)通过静态变量传递数据
1.为什么要使用静态变量传递数据?
说明:使用Intent可以很方便在不同的Activity之间传递数据,这个也是官方推荐的方式,但是也有一定的局限性,就是Intent无法传递不能序列化的对象。我们可以使用静态变量来解决这个问题;
2.跟Intent数据传递的方法类似,只是在源Activity中使用目标Activity的类直接访问自己定义的Static成员变量来进行直接赋值的(使用的语法是静态成员变量可以直接通过自己的类名来进行调用).
3.源代码如下:
MainActivity.java
目标Activity————-StaticIntentTest.java
(三)通过剪切板传递数据
1. 什么是剪切板技术
MainActivity.java
继承自Application的数据资源文件Myapp.java
目标Activity文件GlobalActivity.java
(五)使用Intent的方式传递数据并返回结果
在实际的应用中,我们不仅仅要向Activity传递数据,而且要从Activity中返回数据,虽然返回数据和传递数据类似,也可以采用前面4种方法,但是一般建议采用Intent对象的方式来返回数据,使用这种方式返回数据,需要使用startActivityForResult方法来显示Activity。
使用Intent的方式传递并返回数据的方法步骤:
1)声明需要传递的类型,然后,老规矩调用Intent的putExpra()方法将数据保存到Intent中,最后,启动带返回值的Activity————startActivityForResult();
2)启动Intent后,在目标Activity中生成Intent对象,并getIntent()后,然后声明与传递过来的数据类型相同的变量,并调用getXXXExtra()来获取传递过来的数据;
3)获取完成以后,重新new一个新的Intent对象后,调用它的putExpra()方法,并将新的变量传递进去后,“被叫”Intent(类比打电话)通过setResult()将结果返回去,并调用finish()结束本次Activity;
4)回调在“主叫”中Intent的onActivityResult()方法对结果进行处理;
注意:(1)触发onActivityResult()方法返回结果条件是必须requestCode>= 0 方可,看下面的Android API文档: (红色部分) 随着Activity启动模式的不同方法执行的顺序会不同,这是后话;
运行结果如下:
输入任意俩个数值后,点击计算结果后,会跳转到目标Activty,然后将结果输入后,点“返回结果”,又会回到主Activity,并显示结果;
源码下载地址:
http://download.csdn.net/download/makeyourchance/9540624
方法步骤:
1.在源Activity中new一个Intent对象,并调用它的putExpra()方法写入要传递的数据;
2. Intent对象调用它的setClass(源Activity.this , 目标Activity.class) 告诉Intent对象要传递到哪里,然后,startActivity(mIntent);
3. 然后在目标Activity中声明Intent对象并将getIntent()赋值给它,有点类似于网络通信中的Secoket套接字,然后,调用getXXXExpra()方法获取保存的数据的方法来实现Intent数据传递;
4. 源码如下:
MainActivity.java
Button mButton= (Button) findViewById(R.id.myButton); mButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent mIntent = new Intent(); /** * 通过Intent类中的putExtra方法可以将简单的数据类型和序列化对象保存到Intent对象中 */ mIntent.putExtra("age", 12); mIntent.putExtra("name", "小李"); mIntent.putExtra("address", "上海"); mIntent.setClass(MainActivity.this, OtherActivity.class); //启动意图 startActivity(mIntent); } });
目标Activity————-OtherActivity.java
private TextView mtTextView; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.other); /** * 使用Intent的putExprd()保存数据 跟 getXXXExpra()方法获取保存的数据的方法来实现Intent数据传递 */ mtTextView = (TextView) findViewById(R.id.msg); Intent intent = getIntent(); int age = intent.getIntExtra("age", 0); String name = intent.getStringExtra("name"); String address = intent.getStringExtra("address"); mtTextView.setText("age--->>" + age + "\n" + "name-->>" + name + "\n" + "address->>" + address); }
(二)通过静态变量传递数据
1.为什么要使用静态变量传递数据?
说明:使用Intent可以很方便在不同的Activity之间传递数据,这个也是官方推荐的方式,但是也有一定的局限性,就是Intent无法传递不能序列化的对象。我们可以使用静态变量来解决这个问题;
2.跟Intent数据传递的方法类似,只是在源Activity中使用目标Activity的类直接访问自己定义的Static成员变量来进行直接赋值的(使用的语法是静态成员变量可以直接通过自己的类名来进行调用).
3.源代码如下:
MainActivity.java
/** * 我们可以使用静态变量来Intent无法传递不能序列化的对象的 * 问题 */ Button staButton=(Button) findViewById(R.id.staticButton); staButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent staIntent = new Intent(); staIntent.setClass(MainActivity.this, StaticIntentTest.class); StaticIntentTest.name="AC"; StaticIntentTest.age = 12; startActivity(staIntent); } });
目标Activity————-StaticIntentTest.java
/** * 通过使用static变量来解决Intent方法传递非序列元数据的问题 * @author Administrator * */ public class StaticIntentTest extends Activity { /** * 在此申明静态变量name 和 age */ public static String name; public static int age; /** * 非序列化数据的TextView声明 */ private TextView staTextView; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); Log.i("xys", "onCreate Method is executed"); setContentView(R.layout.other); /** * 使用在目标Activity声明静态属性的方法来实现Intent非序列化数据的传递 */ staTextView = (TextView) findViewById(R.id.staticmsg); staTextView.setText("-name->>"+name+"\n"+"-age-->>"+age); }
(三)通过剪切板传递数据
1. 什么是剪切板技术
在Activity之间数据传递还可以利用一些技巧,不管是Windows还是Linux操作系统,都会支持一种叫剪切板的技术,也就是某一个程序将一些数据复制到剪切板上,然后其他的任何程序都可以从剪切板中获取数据。 2.使用的方法步骤: (1)使用Serializable接口将数据序列化; (2)将数据对象转化为字符串,并保存到剪切板中; (3)从剪切板中拿出并解码,还原数据对象; (4)程序运行流程图如下:
3.代码如下:
MainActivity.java
/** * * 使用剪切板技术来实现activity之间数据的传递 * (注:剪切板技术是一个通用的数据传递技术,比如:手机中复制文字或者图片等,不同的activity中均有这个功能并且数据共享; */ Button clipboardButton = (Button) findViewById(R.id.ClipboardButton); clipboardButton.setOnClickListener(new OnClickListener() { MyData myData = new MyData("Blue", 15); //将对象转化为字符串 ByteArrayOutputStream mArrayOutputStream = new ByteArrayOutputStream();//生成一个字节数组对象 String base64String = ""; try { //将字节数组对象赋值给ObjectOutputStream对象 ObjectOutputStream mObjectOutputStream = new ObjectOutputStream(mArrayOutputStream); //ObjectOutputStream对象调用它的writeObject()方法将数据对象写入ObjectOutputStream流内; mObjectOutputStream.writeObject(myData); //按照Base64的格式对已经转化为字节数组(通过调用toByteArray())的字节数组输出流mArrayOutputStream对象进行编码(成为字符串) base64String = Base64.encodeToString(mArrayOutputStream.toByteArray(), Base64.DEFAULT); mObjectOutputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } ClipboardManager mClipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); mClipboardManager.setText(base64String); Intent mIntent = new Intent(MainActivity.this , ClipboardActivity.class); startActivity(mIntent); } });
继承自Application的数据资源文件Myapp.java
package com.example.intenttest; /** * 通过使用全局对象Application来实现Activity间数据的传递 * @author Administrator * */ import android.app.Application; public class MyApp extends Application { public String name; public int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); setName("Per"); } }
目标Activity文件GlobalActivity.java
package com.example.intenttest; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; /** * 通过使用全局对象Application来实现Activity间数据的传递 * @author Administrator * */ public class GlobalActivity extends Activity { private MyApp myApp; private TextView glTextView; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.other); glTextView = (TextView) findViewById(R.id.GlobalTextView); //myApp = (MyApp) getApplication(); myApp=(MyApp) getApplication(); glTextView.setText("-----appName-----" + myApp.getName()+"\n"+"====appAge====="+myApp.getAge()); } }
(五)使用Intent的方式传递数据并返回结果
在实际的应用中,我们不仅仅要向Activity传递数据,而且要从Activity中返回数据,虽然返回数据和传递数据类似,也可以采用前面4种方法,但是一般建议采用Intent对象的方式来返回数据,使用这种方式返回数据,需要使用startActivityForResult方法来显示Activity。
使用Intent的方式传递并返回数据的方法步骤:
1)声明需要传递的类型,然后,老规矩调用Intent的putExpra()方法将数据保存到Intent中,最后,启动带返回值的Activity————startActivityForResult();
2)启动Intent后,在目标Activity中生成Intent对象,并getIntent()后,然后声明与传递过来的数据类型相同的变量,并调用getXXXExtra()来获取传递过来的数据;
3)获取完成以后,重新new一个新的Intent对象后,调用它的putExpra()方法,并将新的变量传递进去后,“被叫”Intent(类比打电话)通过setResult()将结果返回去,并调用finish()结束本次Activity;
4)回调在“主叫”中Intent的onActivityResult()方法对结果进行处理;
注意:(1)触发onActivityResult()方法返回结果条件是必须requestCode>= 0 方可,看下面的Android API文档: (红色部分) 随着Activity启动模式的不同方法执行的顺序会不同,这是后话;
运行结果如下:
输入任意俩个数值后,点击计算结果后,会跳转到目标Activty,然后将结果输入后,点“返回结果”,又会回到主Activity,并显示结果;
源码下载地址:
http://download.csdn.net/download/makeyourchance/9540624
相关文章推荐
- Python动态类型的学习---引用的理解
- 我是运营,我没有假期
- 土人系列AS入门教程 -- 对象篇
- DB2数据库的安装
- C#实现把指定数据写入串口
- “传奇”图象数据存储方式
- C#托管堆对象实例包含内容分析
- 修复mysql数据库
- C#实现获取不同对象中名称相同属性的方法
- javascript asp教程第十一课--Application 对象
- 浅析SQL数据操作语句
- SQLServer 数据导入导出的几种方法小结
- 简述MySQL分片中快速数据迁移
- MySQL数据备份之mysqldump的使用详解
- PowerShell中使用Out-String命令把对象转换成字符串输出的例子
- C#实现窗体间传递数据实例
- VBS教程:对象-正则表达式(RegExp)对象
- C#中的委托数据类型简介
- SQL Server删除表及删除表中数据的方法
- SqlServer2008误操作数据(delete或者update)后恢复数据的方法