发现用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传输数据的补充的更多相关文章

  1. Android在 普通类(非Activity,多数为Adapter) 中 传输数据为空值 解决方法 :在startActivity 用 intent传输数据

    这是bundle是传输不了数据的,获取到 出现这种情况的原因是非activity类中不存在Context,而在活动中传输数据时需要Context. 我收集到了两种解决方法. 1. 在调用该Adapte ...

  2. android菜鸟学习笔记11----Intent的两点补充

    关于Intent的两点补充: 1.隐式Intent启动组件,会有一个Intent解析的过程,若找不到能够处理该Intent的组件,程序就会异常终止.一个合理的做法是,在使用Intent实例启动组件如: ...

  3. Activity详解

    Activity是android应用的重要组成单元之一(另外3个是Service,BroadcastReceiver和ContentProvider).实际应用包含了多个Activity,不同的Act ...

  4. Android之多媒体扫描过程

    转自:http://blog.csdn.net/yan8024/article/details/6620359下面是系统图      MediaScannerReceiver会在任何的ACTION_B ...

  5. Android四大基本组件介绍及生命周期

    Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一.了解四大基本组件 Activity ...

  6. 从字节跳动离职后,拿到探探、趣头条、爱奇艺、小红书、15家公司的 offer【转】

    前言 博主目前从事Android开发3年,前两年一直在抖音工作.我这篇文章并不是简单的描述一些面试中的题,或者总结一些Android的知识,而是想记录我整个的想法和准备的过程,以及一些心得体会,让大家 ...

  7. Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)

    前言 啦啦啦~博主又来骚扰大家啦~大家是不是感觉上次的Android开发博文有点长呢~主要是因为博主也是小白,在做实验的过程中查询了很多很多概念,努力去理解每一个知识点,才完成了最终的实验.还有就是随 ...

  8. Android 通过 Intent 传递类对象或list对象

    (转:http://www.cnblogs.com/shaocm/archive/2013/01/08/2851248.html) Android中Intent传递类对象提供了两种方式一种是 通过实现 ...

  9. Intent之前的对象传递与fragment传递数据

    Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象. 要求被传递的对象必须实现上述2种接口中的一种 ...

随机推荐

  1. 当滚动条滚动到页面底部自动加载增加内容的js代码

    这篇文章主要介绍了如何使用javscript实现滚动条滚动到页面底部自动加载增加页面内容,需要的朋友可以参考下..1,注册页面滚动事件,window.onscroll = function(){ }; ...

  2. C# 窗体间传值方法大汇总

    第一种方法:创建一个类,里面声明用于存储接收的字段.传的时候存储于字段中,要用的时候,直接类名.字段名 进行调用.(这种方法传递是双向的) 第二种方法:1.在Form1里定义 public strin ...

  3. 【公司要求】- RPC学习(一)

    HADOOP-IPC(这里说的是1.0.4版本) 是轻量级RPC,在hadoop中主要用于2方面 1.TaskTracker和JobTracker 通讯. 2.NameNode和DataNode通讯. ...

  4. DBContext

    http://www.entityframeworktutorial.net/EntityFramework4.3/dbcontext-vs-objectcontext.aspx As you hav ...

  5. Miller_Rabin (米勒-拉宾) 素性测试

    之前一直对于这个神奇的素性判定方法感到痴迷而又没有时间去了解.借着学习<信息安全数学基础>将素性这一判定方法学习一遍. 首先证明一下费马小定理. 若p为素数,且gcd(a, p)=1, 则 ...

  6. 未能加载文件或程序集“XXXXXX”或它的某一个依赖项。试图加载格式不正确的程序。

    在本机WIN7机器上的WebService部署到Win2008R2上发现错误 “/”应用程序中的服务器错误. 未能加载文件或程序集“XXXXXX”或它的某一个依赖项.试图加载格式不正确的程序. 说明: ...

  7. 【第七篇】bootstrap的3级菜单样式,支持母版页保留打开状态

    razor视图的,母版页 依旧不多说,直接上代码 <ul class="sidebar-menu"> @for (int i = 0; i < mList.Cou ...

  8. BZOJ3306: 树

    3306: 树 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 311  Solved: 86[Submit][Status] Description ...

  9. [CTO]创业团队CTO应具备的素质

    原文地址:http://www.cyzone.cn/a/20131001/245862_2.html [导读]CTO要让技术团队明白,公司不是请你来搞纯技术研发的,个别人可以纯技术导向,但整个团队的目 ...

  10. typedef函数指针用法

    typedef void(*vp)(); 将vp声明为一个函数指针类型,该类型的指可以针指向一个没有参数,带空返回值的函数. 调用方法vp p;创建一个vp类型的函数指针p void print(vp ...