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[] 打交道。
最新文章
- location对象说明
- JavaScript数据属性与访问器属性
- SQL语句小总结
- linux shell脚本通过参数名传递参数值
- B+树索引和哈希索引的区别——我在想全文搜索引擎为啥不用hash索引而非得使用B+呢?
- gridview数据导出到word和excel以及excel的导入
- 使用appium做自动化时如何切换activity
- 使用UISegementControl实现简易汤姆猫程序
- Java多线程编程中Future模式的详解
- Redis学习笔记(二)-key相关命令【转载】
- Unity 继承MonoBehaviour脚本 执行顺序 详解
- How to fix “HTTP Status Code 505 – HTTP Version Not Supported” error?--转
- java利用自定义类型对树形数据类型进行排序
- WmS简介(三)之Activity窗口是如何创建的?基于Android7.0源码
- [Redux] redux之combineReducers
- Linux 文件内容查看(cat、tac、nl 、more 、less、head、tail )
- 【Spring学习】Spring的源码解析之路 ——【step1】基础环境配置 + IDEA快捷键整理
- java iterator
- 在Linux下锁住键盘和鼠标而不锁屏
- C#中类的序列化和反序列化
热门文章
- Spring Loaded is a JVM agent for reloading class file changes
- kafka安装及常用命令
- ubuntu下搭建hive(包括hive的web接口)记录
- javascript 递归调用
- ajax返回JSON时的处理方式
- LA 4255 Guess
- Ext.grid.plugin.RowExpander的简单用法
- VIM的配置文件(vimrc)在哪里?【Win7】
- Miller_Rabin (米勒-拉宾) 素性测试
- 为Gradle添加tomcat插件,调试WEB应用