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

1. 使用Intent来传递数据

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

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

程序Demo如下:

IntentDemo.java

package com.android.intentdemo;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;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

package com.android.intentdemo;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.widget.TextView;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);    }}

——>

2. 在Activity之间使用静态变量传递数据

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

需求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);

——>


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

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

新建一个MyData.java

package com.android.intentdemo;import java.io.Serializable;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.Intent中使用全局变量来传递数据

需求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");    }}

Andr oidManifest.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" 来 指定全局变量名称。

——>


















未完待续,持续更新中......

更多相关文章

  1. MapMe
  2. Android蓝牙开发的一些经验
  3. Android中打开多个Activity,返回到第一个Activity
  4. 腾讯微博java(android) sdk 数据更新相关api详细介绍
  5. 安卓数据库sqlite增删查改—模拟用户登录与管理(2020-6-19)
  6. Android(安卓)ContentProvider的线程安全(一)
  7. android SQLite实现本地登录注册功能,SQLite简单应用(android stu
  8. Android数据库的操作之存储和获取
  9. 收藏老罗的----------Android应用程序组件Content Provider简要

随机推荐

  1. 如何使用jQuery将输入值插入更多填充的字
  2. 具有固定宽度网格的引导程序和应跨越窗口
  3. 高德地图api接口poi检索示例----并在信息
  4. 六步使用ICallbackEventHandler实现无刷
  5. JavaScript学习笔记--语法
  6. 在指定的div - js内按id计算div的数量
  7. 寻找解决方案,以每100速率1显示div随机而
  8. AngularJs在模态中注入模板html
  9. 在传递给google.setOnLoadCallback()的函
  10. 记12306货运系统“抢订空车”插件的编写-