Intent:
一.intent传输数据时,可以传递哪些类型的数据?
(非常多)
- 1.java的常见数据类型和String和他们的数组形式
- 2.还有bundle
- 3.还有实现了Serializable和Parcelable接口的对象
二.Serializable和Parcelable的区别
- 1.使用内存时:
- Parcelable比Serializable更高效
- 2.使用磁盘时:
- Parcelable不能使用在要将数据存在磁盘上的情况
- 静Serializable效率更低,但磁盘情况下,还是药用Serializable
- 3.临时变量方面:
- Serializable会产生大量的临时变量,引起频繁的GC
实现:
Serializable:
- 一个类继承了Serializeble即可,就可以自动化序列化了
Parcelable:
- 1.实现该接口
- 2.按要求自动复写4个方法
- 3.我们要写的(因为其特性是存到内存)
- 1.属性
- 2.构造包对象给属性赋值
- 3.写到包对象的方法
- 包对象写出数据
import android.os.Parcel;
import android.os.Parcelable;
/**
* 按实现要求:
* 1.构造函数
* 2.Creator接口
* 3.描述内容
* 4.写到包里
*
* 我们要写的:
* 1.属性
* 2.构造包对象给属性赋值;
* 3.写到包对象方法:
* 包对象写出数据;
*/
public class Book implements Parcelable {
//1.写属性
private String bookName;
private String author;
private int publishDate;
//2.构造,包对象读取属性
protected Book(Parcel in) {
bookName = in.readString();
author = in.readString();
publishDate = in.readInt();
}
public static final Creator<Book> CREATOR = new Creator<Book>() {
@Override
public Book createFromParcel(Parcel in) {
return new Book(in);
}
@Override
public Book[] newArray(int size) {
return new Book[size];
}
};
@Override
public int describeContents() {
return 0;
}
//3.包对象写入属性
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(bookName);
out.writeString(author);
out.writeInt(publishDate);
}
/*--------------再写个set和get--------------*/
public int getPublishDate() {
return publishDate;
}
public void setPublishDate(int publishDate) {
this.publishDate = publishDate;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
三.请描述Intent和IntentFilter
Intent:
* 1.可以比作一封Email:不仅包含了“地址”,也可以包含“内容”
* 地址是必须的,内容是可选的
- 2.可实现各种系统组件之间的跳转,调用,激活
IntentFilter:
- 1.可以比作邮局的分拣系统,分拣系统用3个参数来识别
2.参数
- 1.Action:动作 view
- 2.Data: 数据 uri
- 3.Category: 额外的附加信息
3.参数讲解:
Action匹配:
- 1.是自定义的一串字符串
2.一个IntentFilter可包含多个Action
<intent-filter > <action android:name="android.intent.action.MAIN" /> <action android:name="cn.itheima.action" /> …… </intent-filter>
3.多个页面注册了同样的Action情况
(我们启动Activity的方法如下)
Intent intent =new Intent(); intent.setAction("cn.itheima.action");
(结果:多个界面都会匹配成功都会创建)
4.系统预定了的Action
表示特定的系统动作
这些Action在android.content.Intent中,一”ACTION_”开头,可通过文档找到详细说明
Uri匹配:
- Intent可通过URI携带外部数据结合给目标组件
在节点,再通过节点匹配外部数据
<data android:mimeType="mimeType" android:scheme="scheme" android:host="host"android:port="port" android:path="path"/> 电话的uri tel: 12345 http://www.baidu.com 自己定义的uri ithuawei://cn.ithuawei/person/10
在中指定的这些属性,只有所有属性都匹配成功,URI才匹配成功.
Category匹配:
- 节点中可以为组件定义一个Category类别列表
- 当Intent中包含这个列表的所有项目时Category类别,匹配才成功
四.下面的代码会是你的应用崩溃吗?如果崩溃怎么避免?
“`
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT,textMessage);
intent.setType(HTTP.PLAIN_TEXT_TYEP);//”text/plain” MIME type
context.startActivity(sendIntent);
“
* 答案:
* 1.如果该代码不是在Activity中启动,比如:在服务或者广播启动,那么会导致程序崩溃
* 2.解决的办法是添加TASK标记避免此错误:
intent添加flag : Intent_ACTIVITY_NEW_TASK
五.Activity和Fragment的区别是什么?
- Activity是界面活动窗口
- Fragmegnt可理解成为碎片
- 1.手机
- 点击按钮列表中的一个跳到另一个界面
- 2.平板
- 点击按钮列表中的一个,更改的只是右边公用部分
- 1.手机