学习android已有时日,但是旧时的知识都好似遗忘了,所以想通过写技术博客来温习知识。孔子曰:“温故而知新,可以为师矣”。鄙人第一次写博客,文笔也不是很好,如若有表述不清,技术点有错误之处,还望各路大神们指点迷津,小弟在此谢过!

寄望:1.写博客当然希望有人看啦~\(≧▽≦)/~啦啦啦,不过没人看也不打紧啦,我也会坚持每天温习和更新自己所学的知识点,我想往实际操作细节方面写,因为当初我学习的时候,很多小小的细节就把我卡住了,浪费好多时间,希望正走在路上的朋友们都能少走点弯路,共同进步。

2.第二个希望通过写博客增强自己的文字表述能力,最好能形成自己的知识体系那就更好啦!O(∩_∩)O哈哈~

3.希望自己能够养成坚持不懈努力的习惯,从坚持写博客到生活的方方面面都能够养成良好的习惯。既然内心已经做出了最重要的选择,那就付出所有激情和热血去开创自己的路吧!

Activity间的数据传递

Intent:(数据传递的灵魂)

Android的应用程序包含三种重要组件:Activity、Service、BroadcastReceiver,应用程序采用一致的方式来启动他们——都是依靠Intent来启动的,Intent封装了程序想要启动的程序的意图。

Intent意图:分隐式意图和显示意图,具体详细知识可以查看视频:

我给出一个基础的视频链接,极客学院的,个人觉得讲得很详细,不过需要注册登录成为会员才能观看:

http://www.jikexueyuan.com/course/681.html

Intent启动Activity的两种方式:startActivity(Intent intent)和 startActivityForResult(Intent intent,int requestCode)

1.使用Intent携带数据

创建两个Activity, FirstActivity和SecondActivity,从FirstActivity中传递数据到SecondActivty中,如下:

在FirstActivity中书写代码传递数据出去:

<span style="font-size:14px;">String data = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("key",data);//key是取数据时需要用到的键,相当于一把钥匙
startActivity(intent);//启动下一个Activity</span>

在SecondActivity中接收数据:

<span style="font-size:14px;">Intent intent = getIntent();//记住接收数据时是使用 getIntent()方法获得intent对象
String data = intent.getStringExtra("key");//通过key取值(即传递数据时候用到的键,相应的,取值时,要传入对应的key)
Log.i("SecondActivity",data);//通过日志打印出获取到的数据</span>


2.使用Bundle包装数据

创建Bundle对象,然后把需要传递的数据都保存在Bundle对象中,然后再将Bundle对象存放在Intent里。到了指定Activity后,先从Intent取出Bundle,再从Bundle中将数据一一取出。

使用bundle 传递数据 步骤:


 (1)先创建一个Bundle的对象


           Intent intent = new Intent();


           Bundle bundle = new Bundle();


                   bundle.putString("name", "阿花");


                   bundle.putString("sex", "女");


                   bundle.putInt("age", 18);


  (2)将Bundle对象放在Intent对象中


intent.putExtra("bundle", bundle);


  (3)启动Activity


intent );


接收数据:


Bundle取值


<span style="font-size:14px;">        Bundle bundle = intent.getBundleExtra("bundle"); //bundle对象中是以一个数组的形式存放数据
        String name = bundle.getString("name");
        String sex = bundle.getString("sex);
        int age = bundle.getInt("age");</span>


3.序列化对象Seriazable



首先创建一个Person类,让Person类实现Serializable接口。Person类中有name,sex,age三个属性,实现Person类的 get 、set 方法。(!注意:该对象的类必需实现Serializable接口)


     


把要传递到下一个Activity的数据存放在Person类的对象中,启动Activity把数据传递出去    

Intent i = new Intent();</span>
Person p = new Person();
       p.setName("钱多多");//通过set方法把数据存到Person类对象p中
       p.setSex("男");
       p.setAge(22);
       i.putExtra("key", p); //向Intent对象中存入Person对象P
       startActivity(i);




在另一个Activity中取传递过来的对象数据:


Intent i = new Intent();</span>




Serializable p = i.getSerializableExtra("key"); //反序列化数据对象
     if (p instanceof Person) { 
            Person person = (Person) p; //获取到携带数据的Person对象p</span>
tv.setText("name:"+ person.getName());//使用数据,把数据展示在TextView上
     }



4.Application传值(不常用)


创建一个类MyApplication ,该类要继承与Application。


 


    2.获得AppLication的对象


         MyApplication application = (MyApplication) MainActivity.this.getApplication();


    3.给MyApplication对象赋值


         application.setData("abc");


取值:


       MyApplication application = (MyApplication) getApplication();


        String data = application.getData();



5.Parcelable(最常用,传递数据效率更高)

(1)实现序列化的方法

Android中实现序列化有两个选择:一是实现Serializable接口(是JavaSE本身就支持的),一是实现Parcelable接口(是Android特有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信(IPC))。实现Serializable接口非常简单,声明一下就可以了,而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。


(2)为什么要序列化?




1)永久性保存对象,保存对象的字节序列到本地文件中;




2)通过序列化对象在网络中传递对象;




3)通过序列化在进程间传递对象。




(3)实现Parcelable步骤




1)implements Parcelable




2)重写writeToParcel方法,将你的对象序列化为一个Parcel对象,即:将类的数据写入外部提供的Parcel中,打包需要传递的数据到Parcel容器保存,以便从 Parcel容器获取数据




3)重写describeContents方法,内容接口描述,默认返回0就可以




4)实例化静态内部对象CREATOR实现接口Parcelable.Creator




public static final Parcelable.Creator<T> CREATOR


注:其中public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。需重写本接口中的两个方法:createFromParcel(Parcel in) 实现从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层,newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话即可(return new T[size]),供外部类反序列化本类数组使用。




总结:简而言之:


       通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象。也可以将Parcel看成是一个流,通过writeToParcel把对象写到流里面,在通过createFromParcel从流里读取对象,只不过这个过程需要你来实现,因此写的顺序和读的顺序必须一致。


这部分有点难哦,单单看文字表述还是很难学得懂得,所以看具体代码或许更能理解多一点,如果要真正掌握,那就必须用它去实现具体功能才能做到了。(实践是检验真理的唯一标准,还是要多练才行啊,单看是学不会编程的呀!)

例子:

import android.os.Parcel;
import android.os.Parcelable;
public class InfoBean implements Parcelable {//序列化信息类
	public InfoBean(String name){//构造方法
		description = name;
	}
	public String description;//描述 -- 取一个字段(信息类InfoBean的一个属性)
	public static final Parcelable.Creator<InfoBean> CREATOR
			=new Parcelable.Creator<InfoBean>(){
		/**
		 *
		 * 2.再通过createFromParcel将Parcel对象映射成你的对象。
		 * @param source
		 * @return
		 */
		@Override
		public InfoBean createFromParcel(Parcel source) {
			//再通过createFromParcel从流里读取对象
			String description = source.readString();
			//把对象保存在数据类对象的构造参数中,返回包含有数据的对象
			return new InfoBean(description) ;
		}
		@Override
		public InfoBean[] newArray(int size) {
			return new InfoBean[size];
		}
	};
	@Override
	public int describeContents() {
		return 0;
	}
	/**
	 * 1.通过writeToParcel将你的对象映射成Parcel对象,
	 * @param dest
	 * @param flags
	 */
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		//通过writeToParcel把对象写到流里面,
		dest.writeString(description);
	}
}

好难,想要表述清楚自己想说的东西不容易啊。希望下一次能进步一点点。