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种接口中的一种 ...
随机推荐
- github不小心同步覆盖了本地文件
昨天不小心github的commit还没push就同步了,导致本地文件被覆盖,一度以为没救了. 后来得微博 @空非无和 @柳烟堆雪 指点,用git reflog 恢复了文件. 事情是这样的... 我在 ...
- OpenCV Manager package was not found
http://www.tuicool.com/articles/322Yj2 !! [1]的底部就有解决办法,一般“\OpenCV-2.4.6-android-sdk\apk”这个路径下就是 Open ...
- [置顶] ArcGIS10.1完美破解步骤详细图文教程
ArcGIS软件安装其实都比较简单的,只要大家清楚每个步骤,顺序安装即可.但是安装过程要注意一些问题,license先安装,安装完成先停止服务,然后再安装desktop.完成后就是破解步骤了,很多同学 ...
- java遍历Map时remove删除元素
public class T { /** * @param args */ public static void main(String[] args) { // TODO Auto-generate ...
- BZOJ 2956 模积和
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2956 题意:给出n和m.计算: 思路: i64 n,m; i64 cal(i64 m,i ...
- List<T> please check srcIndex
这种错误的原因,是因为List<T>不是线程安全的.
- Kafka安装与实验
接上面一篇文章: http://www.cnblogs.com/charlesblc/p/6038112.html 主要参考这篇文章: http://www.open-open.com/lib/vie ...
- tomcat下jndi的三种配置方式
jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...
- HDU 1838 Chessboard
dp[i][j]表示以(i,j)为右下角所含棋盘的最大规模, 如果 s[i][j] == s[i-1][j-1] && s[i][j] != s[i-1][j] && ...
- Swift 2.0 : 'enumerate' is unavailable: call the 'enumerate()' method on the sequence
Swift 2.0 : 'enumerate' is unavailable: call the 'enumerate()' method on the sequence 如下代码: for (ind ...