Activity之间传递数据方式

作者: 魔术师6967 | 来源:发表于2016-04-13 17:50 被阅读942次

    Activity之间的数据传递的4种方式


    1 使用Intent传递

        Intent含义

    An intent is an abstract description of an operation to be performed.

    官方给出的解释:意图是即将执行某种操作的一个抽象描述。意图可以开启一个活动、一个服务或者把意图发送给一个广播接收器。

    Activity之间或 Activity 和 Service 之间普遍存在关联,所以他们之间就要进行数据的传递,Intent就是负责传递数据。

       Intent传递数据

    intent.putExtra(key,value)

    这是 intent 传递数据的方法,key代表是一个标志符,在目标Activity中可以通过getIntent.getExtra(key) 获得value,而value不但可以是基本数据类型,还可以是一个对象的引用,但这个对象对应的类必须实现序列化接口(即Serializable或Parcelable)。

    Serializable和Pacelable接口的区别简单来讲:

       Serializable 基于反射,运行时占用内存大;

       Pacelable 基于分解,执行效率高;

    属于Java自带的Serializable接口实现很简单,只要在类中添加 implement Serializable,如下所示:

    public class Book implements Serializable

    而实现android特有Parelable接口需要

    public class Book implements Pacelable

    并且实现它的(1)writeToParcel  (2)describeContents  (3)实例化静态内部对象CREATOR实现接口Parcelable.Creator 这里就不详细讲了,真正用到就可以自己去查

    2 使用全局变量Application

    Base class for those who need to maintain global application state.

    解释:application 是需要维持全局状态的类的基类

    因为application的生命周期是整个应用程序的生命周期,随着应用程序的创建而创建,销毁而销毁,所以可以在activity中把数据存进或取出application中变量的值,这样所有的activity就可以对同一个application进行操作,这里不用担心线程安全的问题。

     public class Test extends Appliction {

    private String name;

    public String getName()    {

         return this.name;        }

    public void setName(String name)   {

         this.name = name;       }

     }

    在源activity中只需要

    Test test;

    test = (Test)getApplication;

    test.setName("张三");

    那跳转到目标activity中

    Test test;

    test = (Test)getApplication;

    String name = test.getName;

    因为在整个应用程序中就一个Application单例,它的生命周期贯穿整个程序,堆内存中只存在一个对象实例,所以程序内所有它的引用指向的是同一块堆内存,所以可以在不同activity对application实例变量进行值的存取。

    3 使用静态变量

    使用静态变量传递数据的方式和application有点相似,都是通过存取固定内存对象的值来传递数据,对象中用static定义的静态成员存放在静态域中,可以通过不同引用来访问,只需在目标activity中定义静态成员变量,源activity就可以直接访问,例如

    public class TargetActivity  {

    public static String name;

    注意:这里的修饰静态变量的访问修饰符不可以是private,因为是跨类访问

    public class SourceActivity {

    TargetActivity.name = "张三";

    4 剪切板传递数据

    Interface to the clipboard service, for placing and retrieving text in the global clipboard.

    ClipboardManager:该类是系统剪切板服务的接口,用来放入或取出全局剪切板中的文本。

    You do not instantiate this class directly; instead, retrieve it through getSystemService(Class).

    不用实例化ClipboardManager,而是通过getSystemService(Class)获取到实例,下面通过一个例子来说明一下:

    //获得剪切板单例

    ClipboardManager clipboardManager = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);

    //添加数据到剪切板

    clipboardManager.setPrimaryClip(ClipData.newPlainText(null,"内容"));

    //检查剪切板是否有数据,并取出数据

    if(clipboardManager.hasPrimaryClip()){

    clipboardManager.getPrimaryClip().getItemAt(0).getText();

    }

    ps:因为鄙人知识有限,如果以上说法有错或不全,有问题欢迎指出或补全

    参考:01《老罗Android开发视频教程》

            02   https://greenrobot.me/devpost/android-parcelable-serializable/

    相关文章

      网友评论

        本文标题:Activity之间传递数据方式

        本文链接:https://www.haomeiwen.com/subject/thswlttx.html