Activity之间传递数据方式

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之间传递数据方式)