使用Intent数据传递实用五部曲

来源:互联网 发布:伪造公司印章软件 编辑:程序博客网 时间:2024/04/27 23:47

(一)使用Intent对象进行数据传递
方法步骤:
1.在源Activity中new一个Intent对象,并调用它的putExpra()方法写入要传递的数据;
2. Intent对象调用它的setClass(源Activity.this , 目标Activity.class) 告诉Intent对象要传递到哪里,然后,startActivity(mIntent);
3. 然后在目标Activity中声明Intent对象并将getIntent()赋值给它,有点类似于网络通信中的Secoket套接字,然后,调用getXXXExpra()方法获取保存的数据的方法来实现Intent数据传递;
4. 源码如下:
MainActivity.java

Button mButton= (Button) findViewById(R.id.myButton);        mButton.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                // TODO Auto-generated method stub                Intent mIntent = new Intent();                /**                 * 通过Intent类中的putExtra方法可以将简单的数据类型和序列化对象保存到Intent对象中                 */                mIntent.putExtra("age", 12);                mIntent.putExtra("name", "小李");                mIntent.putExtra("address", "上海");                mIntent.setClass(MainActivity.this, OtherActivity.class);                //启动意图                 startActivity(mIntent);            }        });

目标Activity————-OtherActivity.java

private TextView mtTextView;    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        setContentView(R.layout.other);        /**         * 使用Intent的putExprd()保存数据 跟 getXXXExpra()方法获取保存的数据的方法来实现Intent数据传递         */        mtTextView = (TextView) findViewById(R.id.msg);        Intent intent = getIntent();        int age = intent.getIntExtra("age", 0);        String name = intent.getStringExtra("name");        String address = intent.getStringExtra("address");        mtTextView.setText("age--->>" + age + "\n" + "name-->>" + name + "\n"                + "address->>" + address);    }

(二)通过静态变量传递数据
1.为什么要使用静态变量传递数据?
说明:使用Intent可以很方便在不同的Activity之间传递数据,这个也是官方推荐的方式,但是也有一定的局限性,就是Intent无法传递不能序列化的对象。我们可以使用静态变量来解决这个问题;
2.跟Intent数据传递的方法类似,只是在源Activity中使用目标Activity的类直接访问自己定义的Static成员变量来进行直接赋值的(使用的语法是静态成员变量可以直接通过自己的类名来进行调用).
3.源代码如下:

MainActivity.java

/**         * 我们可以使用静态变量来Intent无法传递不能序列化的对象的         * 问题         */        Button staButton=(Button) findViewById(R.id.staticButton);        staButton.setOnClickListener(new OnClickListener()        {            @Override            public void onClick(View v) {                // TODO Auto-generated method stub                Intent staIntent = new Intent();                staIntent.setClass(MainActivity.this, StaticIntentTest.class);                StaticIntentTest.name="AC";                StaticIntentTest.age = 12;                startActivity(staIntent);            }        });

目标Activity————-StaticIntentTest.java

/** * 通过使用static变量来解决Intent方法传递非序列元数据的问题 * @author Administrator * */public class StaticIntentTest extends Activity {    /**     * 在此申明静态变量name 和 age     */    public static String name;    public static int age;    /**     * 非序列化数据的TextView声明     */    private TextView staTextView;    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        Log.i("xys", "onCreate Method is executed");        setContentView(R.layout.other);        /**         * 使用在目标Activity声明静态属性的方法来实现Intent非序列化数据的传递         */        staTextView = (TextView) findViewById(R.id.staticmsg);        staTextView.setText("-name->>"+name+"\n"+"-age-->>"+age);    }

(三)通过剪切板传递数据
1. 什么是剪切板技术

      在Activity之间数据传递还可以利用一些技巧,不管是Windows还是Linux操作系统,都会支持一种叫剪切板的技术,也就是某一个程序将一些数据复制到剪切板上,然后其他的任何程序都可以从剪切板中获取数据。  2.使用的方法步骤:             (1)使用Serializable接口将数据序列化;            (2)将数据对象转化为字符串,并保存到剪切板中;            (3)从剪切板中拿出并解码,还原数据对象;            (4)程序运行流程图如下:

这里写图片描述

3.代码如下:

MainActivity.java

/**         *          * 使用剪切板技术来实现activity之间数据的传递         * (注:剪切板技术是一个通用的数据传递技术,比如:手机中复制文字或者图片等,不同的activity中均有这个功能并且数据共享;         */        Button  clipboardButton = (Button) findViewById(R.id.ClipboardButton);        clipboardButton.setOnClickListener(new OnClickListener() {                MyData myData = new MyData("Blue", 15);                //将对象转化为字符串                ByteArrayOutputStream mArrayOutputStream = new ByteArrayOutputStream();//生成一个字节数组对象                String base64String = "";                try {                    //将字节数组对象赋值给ObjectOutputStream对象                    ObjectOutputStream mObjectOutputStream = new ObjectOutputStream(mArrayOutputStream);                    //ObjectOutputStream对象调用它的writeObject()方法将数据对象写入ObjectOutputStream流内;                    mObjectOutputStream.writeObject(myData);                    //按照Base64的格式对已经转化为字节数组(通过调用toByteArray())的字节数组输出流mArrayOutputStream对象进行编码(成为字符串)                    base64String = Base64.encodeToString(mArrayOutputStream.toByteArray(), Base64.DEFAULT);                    mObjectOutputStream.close();                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                ClipboardManager mClipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);                mClipboardManager.setText(base64String);                Intent mIntent = new Intent(MainActivity.this , ClipboardActivity.class);                   startActivity(mIntent);            }        });

继承自Application的数据资源文件Myapp.java

package com.example.intenttest;/** *  通过使用全局对象Application来实现Activity间数据的传递 * @author Administrator * */import android.app.Application;public class MyApp extends Application {    public String name;    public int age;    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    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("Per");    }}

目标Activity文件GlobalActivity.java

package com.example.intenttest;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;/** *  通过使用全局对象Application来实现Activity间数据的传递 * @author Administrator * */public class GlobalActivity extends Activity {    private MyApp myApp;    private TextView glTextView;    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        setContentView(R.layout.other);        glTextView = (TextView) findViewById(R.id.GlobalTextView);        //myApp = (MyApp) getApplication();        myApp=(MyApp) getApplication();        glTextView.setText("-----appName-----" + myApp.getName()+"\n"+"====appAge====="+myApp.getAge());    }}

(五)使用Intent的方式传递数据并返回结果
在实际的应用中,我们不仅仅要向Activity传递数据,而且要从Activity中返回数据,虽然返回数据和传递数据类似,也可以采用前面4种方法,但是一般建议采用Intent对象的方式来返回数据,使用这种方式返回数据,需要使用startActivityForResult方法来显示Activity。
使用Intent的方式传递并返回数据的方法步骤:
1)声明需要传递的类型,然后,老规矩调用Intent的putExpra()方法将数据保存到Intent中,最后,启动带返回值的Activity————startActivityForResult();
2)启动Intent后,在目标Activity中生成Intent对象,并getIntent()后,然后声明与传递过来的数据类型相同的变量,并调用getXXXExtra()来获取传递过来的数据;
3)获取完成以后,重新new一个新的Intent对象后,调用它的putExpra()方法,并将新的变量传递进去后,“被叫”Intent(类比打电话)通过setResult()将结果返回去,并调用finish()结束本次Activity;
4)回调在“主叫”中Intent的onActivityResult()方法对结果进行处理;
注意:(1)触发onActivityResult()方法返回结果条件是必须requestCode>= 0 方可,看下面的Android API文档: (红色部分) 随着Activity启动模式的不同方法执行的顺序会不同,这是后话;

这里写图片描述
运行结果如下:

这里写图片描述

输入任意俩个数值后,点击计算结果后,会跳转到目标Activty,然后将结果输入后,点“返回结果”,又会回到主Activity,并显示结果;
源码下载地址:

http://download.csdn.net/download/makeyourchance/9540624

1 0
原创粉丝点击