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

1. 使用Intent来传递数据

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

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

  程序Demo如下:

  IntentDemo.java

public class IntentDemo extends Activity {

    private Button button;

    @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initComponent();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(IntentDemo.this, Other.class);
// 在Intent中传递数据
intent.putExtra("name", "AHuier");
intent.putExtra("age", 22);
intent.putExtra("address", "XiaMen");
// 启动Intent
startActivity(intent);
}
});
} private void initComponent() {
button = (Button) findViewById(R.id.button); }
}

other.java

public class Other extends Activity {

    private TextView textView;

    @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
initComponent(); Intent intent = getIntent();
int age = intent.getIntExtra("age", 0);
String name = intent.getStringExtra("name");
String address = intent.getStringExtra("address"); textView.setText("My age is " + age + "\n" + "My name is " + name + "\n" + "My address "
+ address);
} private void initComponent() { textView = (TextView) findViewById(R.id.msg);
}
}

——>

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

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

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

  程序Demo:

  IntentDemo.java

    Intent intent = new Intent();
intent.setClass(IntentDemo.this, Other.class);
Other.age = 22;
Other.name = "AHuier";
Other.address = "XiaMen";
startActivity(intent);

Other.java

    private TextView textView;
public static int age;
public static String name;
public static String address; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
initComponent();
textView.setText("My age is " + age + "\n" + "My name is " + name + "\n" + "My address "
+ address);
}

 ——>

3. 通剪切板传递数据

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

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

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

  程序Demo:

  IntentDemo.java

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

  Other.java

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

——>+

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

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

  MyData.java

public class MyData implements Serializable {

    private String name;
private int age; public MyData(String name, int age) {
super();
this.name = name;
this.age = age;
} // 提供一个toString()方法
@Override
public String toString() {
return "MyData [name=" + name + ", age=" + age + "]";
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} }

  IntentDemo.java

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

  Other.java

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

——>

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

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

  Main.java

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

  Other.java

private MyApp myApp;
private TextView textView;
...
myApp = (MyApp)getApplication();
textView.setText("--- The app name ---" + myApp.getName());

  MyApp.java

package com.android.intentglobal;

import android.app.Application;

/*
* 查看Android官方文档。
* Application 是所有那些需要维护全局application状态的基类。你可以提供你自己的实现机制通过在在AndroidManifest.xml中提供你自己的需要声明
* 的标记你自己的标签。
* onCreate()方法是在应用程序启动的时候被回调的。
*/
public class MyApp extends Application { public String name; 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("AHuier");
}
}

  AndroidManifest.xml

    <application
android:name=".MyApp"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name="com.android.intentglobal.Main"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.android.intentglobal.Other"></activity>
</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. C#2.0至4.0 的一些特性

    罗列清单备查 一.C#2.0 1. Partial class 分部类 file1.cs using System; public partial class MyClass { public voi ...

  2. vim 自動化配置

    Vim是Linux系統上常用的編輯器/Text Editor.不過很多人由於不瞭解如何配置,增加了很多煩惱. 今天介紹一個自動化的配置spf13,直接下載製作好的配置並進行自動設置. 1.官方的安裝步 ...

  3. 暑假集训(1)第八弹 -----简单迷宫(Poj3984)

    Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, ...

  4. C++写一个排列组合小程序

    今天突然想到一个问题,有时候,针对同一个事件有多种反映,特别是游戏AI当中,这种情况下需要采取最适合的方案,哪种方案最适合,可以将每种方案的结果或影响都计算一遍,从而选择最合适的.最基本就是一个排列组 ...

  5. C++11中新特性之:initializer_list详解

    C++11提供的新类型,定义在<initializer_list>头文件中. template< class T > class initializer_list; 先说它的用 ...

  6. C语言的可变参数

    可变参数给编程带来了很大的方便,在享受它带来的方便的同时,很有必要了解一下其实现方式,在了解编程语言的同时,也可以扩展编程的思路. 可变参数需要用到3个宏函数和一个类型,他们都定义在<stdar ...

  7. 构建 struts2 spring3 mybatis 的maven项目 构建 pom.xml

    学习maven项目时 搭建个ssm项目 算是给自己留个备份吧 环境说明: MyEclipse10 Maven   3.2.3 框架: struts2    2.3.24.1 spring3    3. ...

  8. [C#]async/Await 使用小计

    如果指定使用 异步 或 异步 修饰符,方法是异步方法,可以实现以下两个函数.  • 清单异步方法可以使用 Await 或指定的 等待 悬挂点.  等待运算符通知编译器异步方法不能继续点的过去,直到等待 ...

  9. jquery放大镜插件与样式

    这是放大镜插件链接,我已经上传到我博客http://files.cnblogs.com/valiant1882331/%E6%94%BE%E5%A4%A7%E9%95%9C%E6%8F%92%E4%B ...

  10. JavaScript实现url地址自动检测并添加URL链接示例代码

    写一个简单的聊天系统,发出Htpp的Url实现跳转加上a标签,下面是具体的实现,感兴趣的朋友不要错过 背景:写一个简单的聊天系统,发出Htpp的Url实现跳转加上a标签.  实现代码: 复制代码代码如 ...