【Android 开发】 : Activity之间传递数据的几种方式

本文详细介绍了在Android开发中Activity之间数据传递的几种常见方式,包括使用Intent、静态变量、剪切板以及全局变量。针对每种方法,提供了具体的代码示例,例如如何通过Intent传递数据,如何利用静态变量解决Intent不能序列化对象的问题,以及如何通过剪切板传递复杂数据。文章还提及了利用全局变量进行数据传递的可能性。
摘要由CSDN通过智能技术生成

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

——>

  

 











  






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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值