发现用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[] 打交道。


最新文章

  1. location对象说明
  2. JavaScript数据属性与访问器属性
  3. SQL语句小总结
  4. linux shell脚本通过参数名传递参数值
  5. B+树索引和哈希索引的区别——我在想全文搜索引擎为啥不用hash索引而非得使用B+呢?
  6. gridview数据导出到word和excel以及excel的导入
  7. 使用appium做自动化时如何切换activity
  8. 使用UISegementControl实现简易汤姆猫程序
  9. Java多线程编程中Future模式的详解
  10. Redis学习笔记(二)-key相关命令【转载】
  11. Unity 继承MonoBehaviour脚本 执行顺序 详解
  12. How to fix “HTTP Status Code 505 – HTTP Version Not Supported” error?--转
  13. java利用自定义类型对树形数据类型进行排序
  14. WmS简介(三)之Activity窗口是如何创建的?基于Android7.0源码
  15. [Redux] redux之combineReducers
  16. Linux 文件内容查看(cat、tac、nl 、more 、less、head、tail )
  17. 【Spring学习】Spring的源码解析之路 ——【step1】基础环境配置 + IDEA快捷键整理
  18. java iterator
  19. 在Linux下锁住键盘和鼠标而不锁屏
  20. C#中类的序列化和反序列化

热门文章

  1. Spring Loaded is a JVM agent for reloading class file changes
  2. kafka安装及常用命令
  3. ubuntu下搭建hive(包括hive的web接口)记录
  4. javascript 递归调用
  5. ajax返回JSON时的处理方式
  6. LA 4255 Guess
  7. Ext.grid.plugin.RowExpander的简单用法
  8. VIM的配置文件(vimrc)在哪里?【Win7】
  9. Miller_Rabin (米勒-拉宾) 素性测试
  10. 为Gradle添加tomcat插件,调试WEB应用