在Android开发中,我们通常需要在不同的Activity之间传递数据,下面我们就来总结一下在Activity之间数据传递的几种方式。

1. 使用Intent来传递数据

  Intent表示意图,很多时候我们都会利用Android的Intent来在各个Activity之间传递数据,这也是Android比较官方的一种数据传递的方式

  需求1:从一个Activity(IntentDemo)跳转到另外一个Activity(Other),其中利用Intent来传递数据

  程序Demo如下:

  IntentDemo.java

  1. public class IntentDemo extends Activity {
  2.  
  3. private Button button;
  4.  
  5. @Override
  6. public void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.main);
  9. initComponent();
  10. button.setOnClickListener(new View.OnClickListener() {
  11. @Override
  12. public void onClick(View v) {
  13. Intent intent = new Intent(IntentDemo.this, Other.class);
  14. // 在Intent中传递数据
  15. intent.putExtra("name", "AHuier");
  16. intent.putExtra("age", 22);
  17. intent.putExtra("address", "XiaMen");
  18. // 启动Intent
  19. startActivity(intent);
  20. }
  21. });
  22. }
  23.  
  24. private void initComponent() {
  25. button = (Button) findViewById(R.id.button);
  26.  
  27. }
  28. }

other.java

  1. public class Other extends Activity {
  2.  
  3. private TextView textView;
  4.  
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. // TODO Auto-generated method stub
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.other);
  10. initComponent();
  11.  
  12. Intent intent = getIntent();
  13. int age = intent.getIntExtra("age", 0);
  14. String name = intent.getStringExtra("name");
  15. String address = intent.getStringExtra("address");
  16.  
  17. textView.setText("My age is " + age + "\n" + "My name is " + name + "\n" + "My address "
  18. + address);
  19. }
  20.  
  21. private void initComponent() {
  22.  
  23. textView = (TextView) findViewById(R.id.msg);
  24. }
  25. }

——>

在此例中使用Intent可以很方便的在不同的Activity之间传递数据,这个是官方推荐的方式,但是也有一定的局限性,就是Intent无法传递不能序列化的对象。我们可以使用静态变量来解决这个问题。

2. 在Activity之间使用静态变量传递数据(个人不推荐)

  需求1:从一个Activity(IntentDemo)跳转到另外一个Activity(Other),其中利用静态变量来传递数据

  程序Demo:

  IntentDemo.java

  1. Intent intent = new Intent();
  2. intent.setClass(IntentDemo.this, Other.class);
  3. Other.age = 22;
  4. Other.name = "AHuier";
  5. Other.address = "XiaMen";
  6. startActivity(intent);

Other.java

  1. private TextView textView;
  2. public static int age;
  3. public static String name;
  4. public static String address;
  5.  
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. // TODO Auto-generated method stub
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.other);
  11. initComponent();
  12. textView.setText("My age is " + age + "\n" + "My name is " + name + "\n" + "My address "
  13. + address);
  14. }

 ——>

3. 通剪切板传递数据

在Activity之间数据传递还可以利用一些技巧,不管是Windows还是Linux操作系统,都会支持一种剪切板的技术,也就是一个程序将一些数据复制到剪切板上,然后其他的任何程序都可以从剪切板中获取数据。

  1) 利用剪切板传递普通的数据,如字符串

  需求1:从一个Activity(IntentDemo)跳转到另外一个Activity(Other),通过剪切板传递数据。

  程序Demo:

  IntentDemo.java

  1. ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
  2. String name = "AHuier";
  3. clipboardManager.setText(name);
  4. Intent intent = new Intent(IntentDemo.this, Other.class);
  5. startActivity(intent);

  Other.java

  1. ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
  2. String msgString = clipboardManager.getText().toString();
  3. textView.setText(msgString);

——>+

  2) 利用剪切板传递复杂的数据,如对象

  需求1:从一个Activity(IntentDemo)跳转到另外一个Activity(Other),通过剪切板传递数据

  MyData.java

  1. public class MyData implements Serializable {
  2.  
  3. private String name;
  4. private int age;
  5.  
  6. public MyData(String name, int age) {
  7. super();
  8. this.name = name;
  9. this.age = age;
  10. }
  11.  
  12. // 提供一个toString()方法
  13. @Override
  14. public String toString() {
  15. return "MyData [name=" + name + ", age=" + age + "]";
  16. }
  17.  
  18. public String getName() {
  19. return name;
  20. }
  21.  
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25.  
  26. public int getAge() {
  27. return age;
  28. }
  29.  
  30. public void setAge(int age) {
  31. this.age = age;
  32. }
  33.  
  34. }

  IntentDemo.java

  1. MyData myData = new MyData("AHuier", 22);
  2. //将对象转换成字符串
  3. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  4. String base64String = "";
  5. try {
  6. ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
  7. objectOutputStream.writeObject(myData);
  8. //使用Android中提供的 Base64 工具类,这个类主要是用来对对象进行压缩也解码的过程,使用默认方式
  9. base64String = Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT);
  10. objectOutputStream.close();
  11. } catch (Exception e) {
  12. // TODO: handle exception
  13. }
  14. ClipboardManager clipboardManager = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
  15. clipboardManager.setText(base64String);
  16. Intent intent = new Intent(IntentDemo.this, Other.class);
  17. startActivity(intent);

  Other.java

  1. ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
  2. String msgString = clipboardManager.getText().toString();
  3.  
  4. //将字符串 msgString 还原为对象
  5. byte[] base64_byte = Base64.decode(msgString, Base64.DEFAULT);
  6. ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(base64_byte);
  7. try {
  8. ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
  9. MyData myData = (MyData)objectInputStream.readObject();
  10. textView.setText(myData.toString());
  11. } catch (Exception e) {
  12. // TODO: handle exception
  13. }

——>

4.使用全局变量来传递数据

  需求1:从一个Activity(Main)跳转到另外一个Activity(Other),通过全局变量来传递数据

  Main.java

  1. private Button button;
  2. private MyApp myApp;
  3. ...
  4. myApp = (MyApp)getApplication();
  5. myApp.setName("kunhuixu"); //修改之后的名称
  6. Intent intent = new Intent(Main.this, Other.class);
  7. startActivity(intent);

  Other.java

  1. private MyApp myApp;
  2. private TextView textView;
  3. ...
  4. myApp = (MyApp)getApplication();
  5. textView.setText("--- The app name ---" + myApp.getName());

  MyApp.java

  1. package com.android.intentglobal;
  2.  
  3. import android.app.Application;
  4.  
  5. /*
  6. * 查看Android官方文档。
  7. * Application 是所有那些需要维护全局application状态的基类。你可以提供你自己的实现机制通过在在AndroidManifest.xml中提供你自己的需要声明
  8. * 的标记你自己的标签。
  9. * onCreate()方法是在应用程序启动的时候被回调的。
  10. */
  11. public class MyApp extends Application {
  12.  
  13. public String name;
  14.  
  15. public String getName() {
  16. return name;
  17. }
  18.  
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22.  
  23. @Override
  24. public void onCreate() {
  25. // TODO Auto-generated method stub
  26. super.onCreate();
  27. setName("AHuier");
  28. }
  29. }

  AndroidManifest.xml

  1. <application
  2. android:name=".MyApp"
  3. android:icon="@drawable/ic_launcher"
  4. android:label="@string/app_name" >
  5. <activity
  6. android:name="com.android.intentglobal.Main"
  7. android:label="@string/app_name" >
  8. <intent-filter>
  9. <action android:name="android.intent.action.MAIN" />
  10.  
  11. <category android:name="android.intent.category.LAUNCHER" />
  12. </intent-filter>
  13. </activity>
  14. <activity android:name="com.android.intentglobal.Other"></activity>
  15. </application>

  [注意]:使用 android:name=".MyApp" 来指定全局变量名称。

 ——>

本文转自:http://blog.csdn.net/ahuier/article/details/8953017

【Android 复习】 : Activity之间传递数据的几种方式的更多相关文章

  1. Android基础 -- Activity之间传递数据(bitmap和map对象)

    原文:http://blog.csdn.net/xueerfei008/article/details/23046341 做项目的时候需要用到在2个activity之间传递一些数据,之前做的都是些字符 ...

  2. 在不同Activity之间传递数据的四种常用方法

    在Android中传递数据的方法非常多,本次介绍4中比较常用的数据传递方法: 1.通过Intent传递数据 2.通过静态变量(static)传递数据 3.通过剪贴板(Clipboard)传递数据 4. ...

  3. iOS------App之间传递数据的几种方式

    UIDocumentInteractionController UIActivityViewController Shared Keychain Access Custom URL Scheme We ...

  4. Android 笔记-Fragment 与 Activity之间传递数据

    Fragment 与 Activity之间传递数据有两种方法.一种是使用setArgument,一种是使用接口回调.以下先学习第一种方法. (1)使用setArgument方法: 为了便于理解,我在这 ...

  5. Android中Activity之间的数据传递

    在开发中,我们经常涌用到Activity,那么既然用到了Activity,就一定免不了在两个或者多个Activity之间传递数据.这里我们先说一说原理,然后在看看代码和例子. 情况A:我们需要从Act ...

  6. Activity之间传递数据或数据包Bundle,传递对象,对象序列化,对象实现Parcelable接口

    package com.gaojinhua.android.activitymsg; import android.content.Intent; import android.os.Bundle; ...

  7. 28、activity之间传递数据&批量传递数据

    import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android ...

  8. [Android学习]Activity之间传递对象和对象集合

    开发过程中,Activity之间传递数据是必不可少的,android中使用Intent和Bundle作为数据载体,在Activity之间传递,对于基础数据类型,Bundle已经提供相关的put,get ...

  9. 在activity之间传递数据

    在activity之间传递数据 一.简介 二.通过intent传递数据 1.在需要传数据的界面调用 intent.putExtra("data1", "我是fry&quo ...

随机推荐

  1. 百度地图API调用实例之地址标注与位置显示

    之前弄了个谷歌地图API标注的调用实例,后来要求改成百度地图. 感谢主,通过网上资料(百度地图API,百度地图API详解之地图标注)收集及研究, 终于把百度地图标注和显示功能实现出来了,具体实现方法如 ...

  2. spring boot 配置文件提示自定义配置属性

    1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  3. [firefly]暗黑源码解析

    一.架构 二.各模块详解 1.net 2.gate 3.game 4.db 三.启动 四.举例说明 五.性能测试

  4. Object-C类目(Category)

    类目是Object-C中最有用的一个特性.实质上,类目允许你为一个已存在的类添加一些方法而不用子类化该类,也不需要你了解该类的实现细节. 这是特别有用的,因为你可以给一个内建的对象添加方法.当你想在你 ...

  5. Oracle 10g 默认安装带来的用户名/密码

    ORACLE数据库创建的时候,创建了一系列默认的用户和表空间 Oracle 10g 默认安装带来的用户名/密码 Username Password Description See Also CTXSY ...

  6. ZOJ 1091 (HDU 1372) Knight Moves(BFS)

    Knight Moves Time Limit: 2 Seconds      Memory Limit: 65536 KB A friend of you is doing research on ...

  7. (hdu)5391 Zball in Tina Town

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5391 Problem Description Tina Town is a friendl ...

  8. java.util.Dictionary源码分析

    Dictionary是一个抽象类,Hashtable是它的一个子类. 类的声明:/** The <code>Dictionary</code> class is the abs ...

  9. JavaWeb网上商城的反思

    不知道从什么时候起,我爱上了写博客,对之前学得的只是进行反思.写了几天课程设计,代码量量8.9千左右. 然后下面文字是我在博客上复制过来的,说得很详细 MVC(Model View Controlle ...

  10. Linux下的visudo命令

    新建了一个test账号,su 后使用visudo命令,发现不可用,退出putty,直接用root登录,可以用了,小白了,visudo只能用root执行,简单写下visudo命令吧 visudo后得到的 ...