Activity 之间的传值



Activity(如果不知道这个的,推荐去看android的基础概念)之间是独立存在的,但是我们经常希望把他们关联起来,那么就需要进行一些参数的传递。
比如在微信的好友列表里面,点击一个好友就可以跳转到我和这个好友聊天的Activity。这里实际上就进行了值的传递。

好的,废话不多说,接下来来说具体的传值方式。

1、Intent 的传值。

Intent intent = new Intent(this, 要跳转的Activity.class);
intent.putExtra("变量名","值");
stratActivity(intent);
另外一种方式是 ou0618 同学指出的。

Intent it = new Intent(this, 要跳转的Activity.class);
Bundle bundle=new Bundle();
bundle.putString("变量名", "值");
it.putExtras(bundle);
startActivity(it);

这样在“要跳转的Activity” 里面就可以进行参数接收。

关于接收参数这里也说一下吧。两种方法的接收方式是一样的。

Bundle extras = getIntent().getExtras();
String 接收的变量 = extras.getString("变量名");

这样的传值方式相信是大家刚接触 android 时候最先了解的。

优势:最先被学习,理解难度不高,不存在资源释放的考虑
劣势:只能在两个Activity之间进行传值,如果多个Activity里面进行传值,则需要保存变量进行多次传递,代码的复杂度增加,也不容易维护。

好了,接下来希望是朋友们来进行完善,提出更多的方式。当然也希望大家指出彼此之间提出来的方案的问题。

2、静态变量的传值。
生命一个静态变量存储类。 public class StateManager

然后生命一个静态变量

public static String userName;

在页面跳转之前,使用 StateManager.userName 进行赋值。 在跳转之后的页面进行获取。

优势:使用方便,可以统一管理,容易维护。
劣势:静态变量的方式在理解上比intent 稍难。同时存在释放机制的处理问题(这里需要比较谨慎的对待。)

好了,今天讲了第二种传值方式,这种方式是我个人推荐的方式。 当然还有其他的传值方式,希望大家可以好好理解目前的两种传值方式,如果可以对比着去理解,会更好。

3、Application的传值。

Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。
在Application中创建一个HashMap ,以字符串为索引,Object为value这样我们的HashMap就可以存储任何类型的对象了。在Activity A中把需要传递的对象放入这个HashMap,然后通过Intent或者其它途经再把这人索引的字符串传递给Activity B ,Activity B 就可以根据这个字符串在HashMap中取出这个对象了。只要再向下转个型 ,就实现了对象的传递。

优势:Appication对象全局单例,使用方便,同时不会出现值丢失的情况。
劣势:因为全局单例,并且随着程序的启动最开始执行,所以如果需要比较大资源的对象启动放在这里,会影响启动效率。一些对于view的保存可能会引起内存泄漏。

好了,今天讲了一下 Application的传值方式,希望大家可以给出更多的见解。 接下来我会更新两种传值方式,但是都不是我推荐的方式。
4、ClipboardManager(剪切板)的传值。

剪切板大家一定不会陌生,也就是我们平时做复制粘贴时候使用的类,虽然我们看不见,但是却经常打交道。因为我们可以复制和获取内容,所以,理所当然,可以用来做数据传递。

通过设置和获取 ClipData 对象进行传值操作。

在传递数据的时候需要用到 ClipData 类, 把要传递的东西放到这里面。

4.1 传递文本:
newPlainText
一般用来传递字符串
4.2 传递uri
newUri
一般用来传递Uri,进行相关的跳转操作
4.3 传递intent
newIntent
这个是最强大的,就是把一个 intent 放到剪切板里面。intent的使用方法参考第一种传值方式。

优势:可以把内容分享到外部应用。传递意图明显(相对其他方式。)
劣势:由于可以分享到站外,所以可能存在数据不安全性。数据放到剪切板,非常容易被用户在执行剪切和复制操作的时候进行了数据覆盖。

好了,今天讲了一下剪切板传值方式。这个方式我个人的建议是除非特殊意图,不推荐使用。

继续期待大家加入讨论和拍砖。
5、数据库的传值。

其实做一个应用,最多要处理的一般来讲是三个事情,ui、数据库、服务器接口。所以数据库应该算是android 开发的基础部分。

数据库是用来保存数据的仓库,所以我们把一些数据放到数据库里面,在需要的时候读取出来,这样就实现了一次值传递的过程。

android 里面的数据库相关类最重要的就是 Cursor ,希望大家可以好好的去理解。


应用的一些设置, 购物车等可以使用数据库的方式进行传值。


优势:数据库存储,可以实现进程关闭之后的值保存。

劣势:只有在某些特定的场景下才可以使用,一般可以理解为单例的东西都可以使用(有人说购物车里有很多物品,为什么算单例。其实你应该想,购物车只有一个。

原文地址:https://www.cnblogs.com/wei1228565493/p/4020115.html