intent和handler的理解和使用
一、当前的对intent和handler的理解
1、intent是作为一个参数传递机制存在的。
(1)它可以向activity传递参数以及Object。(Object需要进行序列化)。
(2)它可以进行系统级别的调用、比如:调起系统拨号页面、调起系统设置等。
(3)intent传递参数的方式:(intent.putString("key","value")、intent.putInt("key","value") 等。)。
2、handler主要是用来在线程中刷新界面显示的。
(1)使用时,需要new handler(){}、在new的时候,里面接收传递的handler的what 值,与传递时给定的静态常亮做一个对应关系,来进行不同的操作。(其中what为int 类型)。
(2)handler中还可以做休眠操作。让线程等待几秒后再运行。(在线程等待时,需要进行try{}catch(Exceptione){}捕捉异常。(在try{}catch(Exception e){}final{}其中finally{}是 不管try和catch走了哪个,都会执行finally{}中的方法。))
(3)在传递handler的时候,可以传递intent类型的值,intent中可以保存数据。然后在new handle(){}的时候进行接收,判断what并执行获取intent中参数的操作。)
二、其中概念模糊的地方
1、intent其他常用的使用情况、如何使用以及注意事项?
2、handler其他常用的使用情况及注意事项?
3、Object序列化的时候,除了Serializable以外,还有一个序列化的方法,两者之间的区别及如何选择合适的序列化方法?
4、handler中如何实现定时任务有几种方法,不同方法如何使用以及注意事项?
三、intent资料查阅总结
1、intent常用的使用方法:
(1)参考地址:https://blog.csdn.net/wjky2014/article/details/78342325
总结:
a、intent的使用场景
i) 通过组件名启动
ii)通过包名、类名启动
iii)通过类启动
iv)打电话
v)发短信
vi)打开网页
vii)播放音乐
viii)打开图片
ix)创建闹钟
x)创建定时器
xi)添加日历事件
xii)拍照
xiii)打开Camera
xiv)打开视频录像
xv)选择联系人
xvi)查看联系人
xvii)编辑联系人
xviii)插入联系人
xix)写邮件
xx)打开地图指定点
阅读笔记:
1.学习到了ComponentName启动activity的方式以及使用。它可以打开其他应用程序中的activity,前提是需要知道要启动activity的完整的包名,并且所打开的activity应为程序的入口activity或者在manifest文件中进行申明:android:exported="true"
2.可能会用到的方法。
/**
* 添加日历事件
* **/
public static void AddCalendarEvent(Contextcontext, String title,
String location, Calendar begin, Calendar end) {
Intent intent = new Intent(Intent.ACTION_INSERT)
.setData(Events.CONTENT_URI).putExtra(Events.TITLE, title)
.putExtra(Events.EVENT_LOCATION, location)
.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin)
.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end);
if (intent.resolveActivity(context.getPackageManager()) != null) {
context.startActivity(intent);
}
}
3. Serializable和Parcelable的使用与区别:
参考地址:https://blog.csdn.net/wei_lei/article/details/50515093
Serializable 是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也很简单,只需要让一个类去实现Serializable 这个接口就可以了。
Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent 所支持的数据类型,这样也就实现传递对象的功能了。
Parcelable 的实现方式要稍微复杂一些。首先我们让Person 类去实现了Parcelable 接口,这样就必须重写describeContents()和writeToParcel()这两个方法。其中describeContents()方法直接返回0 就可以了,(内容描述接口,基本不用管)而writeToParcel()方法中我们需要调用Parcel的writeXxx()方法将Person 类中的字段一一写出。注意字符串型数据就调用writeString()方法,整型数据就调用writeInt()方法,以此类推。 除此之外,我们还必须在Person 类中提供一个名为CREATOR 的常量,这里创建了Parcelable.Creator 接口的一个实现,并将泛型指定为Person。接着需要重写createFromParcel()和newArray()这两个方法,在createFromParcel()方法中我们要去读取刚才写出的name 和age字段,并创建一个Person 对象进行返回,其中name 和age 都是调用Parcel 的readXxx()方法读取到的,注意这里读取的顺序一定要和刚才写出的顺序完全相同。而newArray()方法中的实现就简单多了,只需要new 出一个Person 数组,并使用方法中传入的size 作为数组大小就可以了
1)在使用内存的时候,Parcelable比Serializable性能高,所以如果要存储大量数据时,推荐使用Parcelable。
2)Serializable在序列化的时候如果所存储的数据量比较大,会产生大量的临时变量,从而引起频繁的GC。
3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。
4) Serializable比Parcelable操作简单便捷。只需要实现Serializable接口即可。
4. Handler定时任务的实现。
1. 定义一个Handler类
Handler handler=new Handler();
Runnable runnable=new Runnable() {
@Override
publicvoid run() {
// TODO Auto-generated method stub
//要做的事情
handler.postDelayed(this, 2000);
}
};
2. 启动计时器
handler.postDelayed(runnable, 5000);//每两秒执行一次runnable.
3. 停止计时器
handler.removeCallbacks(runnable);
经过运行demo测试得出:
Runnable中的handler.postDelayed(this,2000);执行时间为:在外部调用了handler.postDelayed(runnable, 5000);以后。其中执行的时间为:5秒以后开始执行每两秒执行一次runnable中的方法,也就是说。handler.postDelayed(this, 2000);其中后面参数变化以后,按照最后一次改变的参数运行!也可以将2000作为一个变量!
执行handler.removeCallbacks(runnable);后,Runnable会马上停止。