• 【Android 复习】 : Activity之间传递数据的几种方式


    在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 + "
    " + "My name is " + name + "
    " + "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 + "
    " + "My name is " + name + "
    " + "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

  • 相关阅读:
    c# linq查询的等于大于符号是什么意思?
    c# Socket tcpClient处理连接超时方式timeout
    不同网段服务器与客户端连接问题解决方法TCP/IP_C/S
    Http请求响应及SpringMVC相关注解解析
    Nginx部署项目,转发规则,负载均衡配置
    Linux redis设置后台启动
    Linux centos7安装Jdk nginx redis
    SpringCloud整合SpringSecurity JWT进行认证 ,鉴权
    C#中class与struct的区别概述
    列举ASP.NET 页面之间传递值的几种方式
  • 原文地址:https://www.cnblogs.com/sishuiliuyun/p/3298970.html
Copyright © 2020-2023  润新知