您的位置:首页 > 移动开发 > Android开发

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

2016-12-13 15:32 645 查看
本文转载自:http://www.360doc.com/content/15/0521/09/17064216_472121800.shtml#

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

1. 使用Intent来传递数据

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

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

程序Demo如下:

IntentDemo.java

[java] view plaincopy

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

[java] view plaincopy

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

[java] view plaincopy

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

Other.java

[java] view plaincopy

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

[java] view plaincopy

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

[java] view plaincopy

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


 ——> 


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

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

新建一个MyData.java

[java] view plaincopy

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

[java] view plaincopy

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

[java] view plaincopy

     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

[java] view plaincopy

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

Other.java

[java] view plaincopy

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

MyApp.java

[java] view plaincopy

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

[html] view plaincopy

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


 ——> 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息