"Intent"-Android面試必問"精華技能點"彙總
阿新 • • 發佈:2019-01-10
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.手機