Intent传输数据的补充
发现用intent的putExtra()或者putExtras()传输的都是基本数据类型。
如果要传输自定义数据类型,就要用到其他方法,老罗介绍的大概有3种:
1. 静态变量
2. 全局变量
3. android剪切板
1. 静态变量
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
MainActivity.java
public class MainActivity extends Activity implements OnClickListener
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(this);
}
@Override
public void onClick(View v)
{
SecondActivity.personName = "merlin";
startActivity(new Intent(this,SecondActivity.class));
}
}
secondactivity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="这是第二个activity"
android:textSize="20sp"
android:gravity="center"/>
</LinearLayout>
SecondActivity.java
public class SecondActivity extends Activity
{
public static String personName; //必须声明为public
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.secondactivity);
Toast.makeText(this, personName, Toast.LENGTH_LONG).show();
}
}
然后在AndroidManifest.xml注册activity
<activity android:name=".SecondActivity"></activity>
效果:

点击按钮、

(个人感觉、局限在了静态成员变量、并且声明为public,应该不常用,谁知道呢)
2. 全局变量 (比较通用的方式)
类似于JavaWEB JSP中的全局变量application,android中也存在一个application域,除非android应用程序清除内存,否则全局对象将一直可以访问。
(配置的时候,即注册的时候,可能和以前的方式有一点区别)
实例:
main_activity.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
secondactivity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="这是第二个activity"
android:textSize="20sp"
android:gravity="center"/>
</LinearLayout>

Person.java
public class Person extends Application
{
private String name;
private int 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;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public void onCreate() //构建该类的对象的时候调用
{
super.onCreate();
setName("jack");
}
}
补充:

MainActivity.java
public class MainActivity extends Activity implements OnClickListener
{
private Person person;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(this);
}
@Override
public void onClick(View v)
{
person = (Person)getApplication();
person.setName("merlin");
person.setAge(22);
startActivity(new Intent(this,SecondActivity.class));
}
}
SecondActivity.java
public class SecondActivity extends Activity
{
private Person person;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.secondactivity);
person = (Person) getApplication();
Toast.makeText(this, person.toString(), Toast.LENGTH_LONG).show();
}
}
注册的时候,有点儿区别:

赶快来看看效果:

点击按钮

还是蛮成功的、
小结一下:
1. 自定义类型的数据,是该应用程序通用的,所有注册的时候,application的name属性要配置成那个样子。
2. 由于传递数据的时候,要用到getApplication的方法
3. 自定义类型要继承 Application类
3. Android内置剪切板(Clipboard)
布局文件和第二个一样。
定义一个自定义类
Person.java
public class Person
{
private String name;
private int 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;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
MainActivity.java (用到了Java IO知识)
public class MainActivity extends Activity implements OnClickListener
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(this);
}
@Override
public void onClick(View v)
{
//android.content.ClipboardManager;
ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
//如果是基本类型String那么就直接:Sting name="a";cm.setText(name); 一会儿取的时候就:cm.getText();
//如果是自定义类型那么就要先序列化
Person person = new Person("merlin",22);
ByteArrayOutputStream baStream = new ByteArrayOutputStream();
String person_Base64String ="";
try
{
ObjectOutputStream out = new ObjectOutputStream(baStream);
out.writeObject(person);
//android.util.Base64
person_Base64String = Base64.encodeToString(baStream.toByteArray(), Base64.DEFAULT);//使用默认编码方式
out.close();
baStream.close();
}
catch (Exception e)
{
}
cm.setText(person_Base64String);
startActivity(new Intent(this,SecondActivity.class));
}
}
接受的时候要反序列话
SecondActivity.java
public class SecondActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.secondactivity);
Person person = null;
ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
String person_base64String = cm.getText().toString();
byte[] base64_array = Base64.decode(person_base64String, Base64.DEFAULT);
ByteArrayInputStream baStream = new ByteArrayInputStream(base64_array);
try
{
ObjectInputStream in = new ObjectInputStream(baStream);
person = (Person) in.readObject();
in.close();
baStream.close();
}
catch (Exception e)
{
// TODO: handle exception
}
Toast.makeText(this, person.toString(), Toast.LENGTH_LONG).show();
}
}
注册一下:

看看效果:


很失败啊、来找一下 问题。


真见鬼!person类没有实现序列化接口,为了简单起见,就实现Serializable接口,让系统自动序列化吧。
public class Person implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
private int 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;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
看看效果如何:


这画面太美了、哈哈。
小结一下:
剪切板的知识其实没有多少,就是一个
ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
然后
cm.setText(String strName);
关键是:如果这里碰上了自定义类的对象,那么就一定要把它转化成为string,中间可能要用到编码,可以使Base64,也可以使其他的,比方说MD5。
从类对象 –> String以及String –> 类对象中间过渡了一个 ByteArrayOutputStream (当然用这个的时候也会有String和byte[ ] 的转换);
具体是这样的:
写的时候: person对象 – in/out流 --- ByteArray流 ----byte[] --base64加密/解密—string
读的时候:(正好顺序相反)
为什么要用到包装流? 因为string直接和byte[] 打交道。
Intent传输数据的补充的更多相关文章
- Android在 普通类(非Activity,多数为Adapter) 中 传输数据为空值 解决方法 :在startActivity 用 intent传输数据
这是bundle是传输不了数据的,获取到 出现这种情况的原因是非activity类中不存在Context,而在活动中传输数据时需要Context. 我收集到了两种解决方法. 1. 在调用该Adapte ...
- android菜鸟学习笔记11----Intent的两点补充
关于Intent的两点补充: 1.隐式Intent启动组件,会有一个Intent解析的过程,若找不到能够处理该Intent的组件,程序就会异常终止.一个合理的做法是,在使用Intent实例启动组件如: ...
- Activity详解
Activity是android应用的重要组成单元之一(另外3个是Service,BroadcastReceiver和ContentProvider).实际应用包含了多个Activity,不同的Act ...
- Android之多媒体扫描过程
转自:http://blog.csdn.net/yan8024/article/details/6620359下面是系统图 MediaScannerReceiver会在任何的ACTION_B ...
- Android四大基本组件介绍及生命周期
Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一.了解四大基本组件 Activity ...
- 从字节跳动离职后,拿到探探、趣头条、爱奇艺、小红书、15家公司的 offer【转】
前言 博主目前从事Android开发3年,前两年一直在抖音工作.我这篇文章并不是简单的描述一些面试中的题,或者总结一些Android的知识,而是想记录我整个的想法和准备的过程,以及一些心得体会,让大家 ...
- Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)
前言 啦啦啦~博主又来骚扰大家啦~大家是不是感觉上次的Android开发博文有点长呢~主要是因为博主也是小白,在做实验的过程中查询了很多很多概念,努力去理解每一个知识点,才完成了最终的实验.还有就是随 ...
- Android 通过 Intent 传递类对象或list对象
(转:http://www.cnblogs.com/shaocm/archive/2013/01/08/2851248.html) Android中Intent传递类对象提供了两种方式一种是 通过实现 ...
- Intent之前的对象传递与fragment传递数据
Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象. 要求被传递的对象必须实现上述2种接口中的一种 ...
随机推荐
- SeaJS 学习
什么是系统 在生活和工作中,我们会接触到大量系统:自然界生态系统.计算机操作系统.软件办公系统,还有教育系统.金融系统.网络系统.理论系统等等.究竟什么是系统呢? 来看下维基百科的解释: 系统泛指由一 ...
- Python 中 os.path模板
os.path.abspath(path) #返回绝对路径 os.path.basename(path) #返回文件名 os.path.commonprefix(list) #返回list(多个路径) ...
- android boot.img 结构
android 的boot.img 包括 boot header,kernel, ramdisk 首先来看看Makefile是如何产生我们的boot.img的: boot镜像不是普通意义上的文件系统, ...
- linux学习之centos(一):在VMware虚拟机中安装centos6.5
---安装环境如下--- 虚拟机版本:VMware Workstation_10.0.3(版本信息介绍:VMware-workstation-full-10.0.3-1895310,下载地址:http ...
- shell进行mysql统计
array=(江苏 浙江 新疆 宁夏 广东 福建 重庆 江西 吉林 湖南 山东 云南 上海 河北 黑龙江 北京 四川 河南 山西 湖北 辽宁 安徽 陕西 广西 贵州 内蒙古 天津 甘肃 海南 青海 ...
- Oracle数据库之二
SELECT查询 函数分为: 单行函数 -- 一条记录进入,一条记录输出 多行函数(分组函数)-- 多条记录进入,按组输出 单行函数: select id,first_name,nvl(commiss ...
- Scrum Agile
Scrum Agile 迭代式增量软件开发,敏捷开发,源于丰田汽车的制造流程. HMC测试流程: 1.hmc改配置 2.上ui验证 3.还原hmm(有的需要,有的不需要) 4.addReferal,在 ...
- Qt之QHeaderView排序
简述 在Windows中我们经常会遇到表头排序,比如可以对文件按照名称.修改日期.类型.大小进行排序,方便我们统一的归类查找. Qt中,我们可以通过点击表头来对QTableView或QTreeView ...
- php如何控制用户对图片的访问 PHP禁止图片盗链(转载)
把images目录设置成不充许http访问(把图片目录的:读取.目录浏览 两个权限去掉). 用一个PHP文件,直接用file函数读取这个图片.在这个PHP文件里进行权限控制. apache环境中,在你 ...
- 配置域名服务器报错named[822]: dns_rdata_fromtext /etc/bind/db.asertest.com mail not a valid number
问题描述: 为了配置邮件服务器,更改了相关域名,改完后,重启bind9报错 Mar 17 14:39:39 DnsServer2 named[822]: dns_rdata_fromtext: /et ...