学习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 传递数据 步骤:
接收数据:
<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
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);
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传值(不常用)
5.Parcelable(最常用,传递数据效率更高)
(1)实现序列化的方法
Android中实现序列化有两个选择:一是实现Serializable接口(是JavaSE本身就支持的),一是实现Parcelable接口(是Android特有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信(IPC))。实现Serializable接口非常简单,声明一下就可以了,而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。
这部分有点难哦,单单看文字表述还是很难学得懂得,所以看具体代码或许更能理解多一点,如果要真正掌握,那就必须用它去实现具体功能才能做到了。(实践是检验真理的唯一标准,还是要多练才行啊,单看是学不会编程的呀!)
例子:
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);
}
}
好难,想要表述清楚自己想说的东西不容易啊。希望下一次能进步一点点。