"Intent"-Android面试必问"精华技能点"汇总

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.平板
      • 点击按钮列表中的一个,更改的只是右边公用部分
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值