1. 程式人生 > >"Intent"-Android面試必問"精華技能點"彙總

"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.平板
      • 點選按鈕列表中的一個,更改的只是右邊公用部分