最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Android中通過Intent類實(shí)現(xiàn)組件間調(diào)用的方法

 更新時間:2016年05月20日 15:25:23   作者:風(fēng)荷舉  
Intent能夠?qū)崿F(xiàn)應(yīng)用間的數(shù)據(jù)交互與通訊,將實(shí)現(xiàn)者和調(diào)用者解耦,接下來就來詳解Android中通過Intent類實(shí)現(xiàn)組件間調(diào)用的方法,需要的朋友可以參考下

Intent是Android中用來調(diào)用其它組件的類,通過Intent,我們可以非常方便的調(diào)用Activity,Broadcast Receiver和Service。

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);

上面這段代碼可以用來調(diào)用第三方的Activity(啟動第三方瀏覽器來打開百度首頁)。
Intent有隱式和顯式之分,上面的

Intent intent = new Intent(Intent.ACTION_VIEW);

所創(chuàng)建的intent被稱為隱式Intent。構(gòu)建隱式Intent需要一個表示action的字符串(例如Intent.ACTION_VIEW,其值為" android.intent.action.VIEW"),Android會尋找能夠處理該action的Activity(在manifest文件中的該Activity下的intent-filter中聲明),并且調(diào)用他。
有時候可能多個Activity都聲明能夠處理某一個action,例如:

<activity
  android:name=".Activity1">
  <intent-filter>
    <action android:name="com.abc.def" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>
<activity
  android:name=".Activity2">
  <intent-filter>
    <action android:name="com.abc.def" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

上面Activity1和Activity2都聲明能夠處理“com.abc.def”的action,因此當(dāng)我們執(zhí)行以下代碼時

Intent intent = new Intent("com.abc.def");
startActivity(intent);

Activity1和Activity2都符合要求,Android將彈出"Complete Action Using"的對話框來讓用戶選擇一個要執(zhí)行的Activity。

值得注意的是,要想能夠匹配隱式Intent的調(diào)用,必須包含DEFAULT的category(就是<category android:name="android.intent.category.DEFAULT"/>),而若要匹配顯式Intent,則不需要該category。

對于隱式Intent,除了action之外,還可以提供多種信息來幫助Android選擇最佳匹配。還可以添加的其他信息包括:host,mimeType,path,pathPattern,pathPrefix,port,scheme。

例如為上面Activity2在manifest中的配置添加一個mimeType的屬性:

<activity
  android:name=".Activity2">
  <intent-filter>
    <action android:name="com.abc.def" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="abc/def"/>
  </intent-filter>
</activity>

那么:

Intent intent = new Intent("com.abc.def");
startActivity(intent);//只有Activity1符合

/********************************************/
Intent intent = new Intent("com.abc.def");
intent.setType("abc/def");
startActivity(intent);//只有Activity2符合

如果在創(chuàng)建Intent的時候,指明了要調(diào)用的類(例如new Intent(xxActivity.this, xx.class),或者通過setComponent來指定),那么這樣的Intent被稱為顯示Intent。

對于顯式Intent,因?yàn)樗呀?jīng)指明了要調(diào)用的具體的類,所以Android會忽略掉其action,category以及data屬性。(個人覺得顯示Intent調(diào)用比隱式的更快些)

Serializable vs Parcelable
Android 主要是通過Intent來實(shí)現(xiàn)組件之間的相互調(diào)用,同時還可以傳遞附加的數(shù)據(jù)。這些數(shù)據(jù)主要是存儲在Bundle之中(當(dāng)調(diào)用Intent.putExtras(Bundle)時,Android會復(fù)制Bundle中的數(shù)據(jù),而不是引用,因此再修改Bundle中的數(shù)據(jù)并不會改變Intent中攜帶的數(shù)據(jù))。

Bundle之中可以存放基本數(shù)據(jù)類型以及實(shí)現(xiàn)了Serializable或Parcelable接口的類。

當(dāng)我們要向Bundle中存放一個類Obj(包含兩個int成員的簡單類),可以讓它實(shí)現(xiàn)Serializable或Parcelable接口,如下所示:

1.Serializable


public class Obj implements Serializable {
  private int a;
  private int b;
  public Obj(int a, int b) {
    this.a = a;
    this.b = b;
  }
  
  @Override
  public String toString() {
    return "Obj: [" + a + ", " + b + "]";
  }
}

我們可以通過intent.putExtra("obj", new Obj(1, 2));來將其放入intent中,然后通過 obj = (Obj) intent.getSerializableExtra("obj");來將其取出。
2.Parcelable


public class ObjPar implements Parcelable {
  private int a;
  private int b;
  public ObjPar(int a, int b) {
    this.a = a;
    this.b = b;
  }
  
  @Override
  public String toString() {
    return "Obj: [" + a + ", " + b + "]";
  }
  @Override
  public int describeContents() {
    return 0;
  }
  @Override
  public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(a);
    dest.writeInt(b);
  }
  
  public static final Parcelable.Creator<ObjPar> CREATOR = new Creator<ObjPar>() {
    
    @Override
    public ObjPar[] newArray(int size) {
      return new ObjPar[size];
    }
    
    @Override
    public ObjPar createFromParcel(Parcel source) {
      
      return new ObjPar(source.readInt(), source.readInt());
    }
  };
}

我們可以通過intent.putExtra("objpar", new ObjPar(1, 2));來將其放入intent中,然后通過 objpar =  (ObjPar) intent.getParcelableExtra("objpar"); 來將其取出。
以上是兩種向Bundle中存放Object對象的方法,明顯可以看出實(shí)現(xiàn)Serializable接口更加簡單,因?yàn)樗且粋€標(biāo)記性的接口,并不需要實(shí)現(xiàn)某個具體方法。相比而言實(shí)現(xiàn)Parcelable接口就顯得相對復(fù)雜一些,但這樣帶來的好處是性能的大幅提高。這是因?yàn)楫?dāng)我們實(shí)現(xiàn)Serializable接口后,真正的序列化工作是由JDK來完成,他需要通過反射來獲取成員變量,因?yàn)榉瓷涞男阅懿⒉桓撸虼诉@種序列化方式速度慢。然而實(shí)現(xiàn)Parcelable接口時,我們提供了該接口中定義方法的實(shí)現(xiàn)(writeToParcel實(shí)現(xiàn)序列化,createFromParcel實(shí)現(xiàn)反序列化),這就避免了反射的使用,因此這種方式速度快。

那么這兩種方式,性能差別有多大呢?下面是國外網(wǎng)站上的一個測試結(jié)果:Serializable耗時是Parcelable的10倍左右

 2016520152123213.png (761×1002)

相關(guān)文章

  • 關(guān)于Android Fragment對回退棧的詳細(xì)理解

    關(guān)于Android Fragment對回退棧的詳細(xì)理解

    這篇文章主要介紹了Android  Fragment的回退棧示例詳細(xì)介紹的相關(guān)資料,在Android中Fragment回退棧是由Activity管理的,每個Activity都有自己的回退棧,其中保存了已經(jīng)停止(處于后臺)的Fragment實(shí)例,需要的朋友可以參考下
    2016-12-12
  • Android自動化獲取卡頓信息的實(shí)現(xiàn)方法

    Android自動化獲取卡頓信息的實(shí)現(xiàn)方法

    自動化獲取卡頓信息就像給App裝  “行車記錄儀”  —— 實(shí)時記錄主線程的“駕駛狀態(tài)”,一旦發(fā)現(xiàn)“急剎車”(卡頓),立刻保存現(xiàn)場(堆棧),事后回看錄像(日志)精準(zhǔn)定位問題,本文給大家介紹了Android自動化獲取卡頓信息的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2025-02-02
  • Android常用三方庫混淆規(guī)則整理(小結(jié))

    Android常用三方庫混淆規(guī)則整理(小結(jié))

    這篇文章主要介紹了Android常用三方庫混淆規(guī)則整理(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Android仿新版微信浮窗效果

    Android仿新版微信浮窗效果

    在新版微信中,可以把瀏覽的文章縮小為浮窗.點(diǎn)擊浮窗繼續(xù)閱讀.這篇文章主要介紹了Android仿新版微信浮窗效果,需要的朋友可以參考下
    2018-06-06
  • Android實(shí)現(xiàn)人臉支付的示例代碼

    Android實(shí)現(xiàn)人臉支付的示例代碼

    本文主要介紹了Android實(shí)現(xiàn)人臉支付,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Android BottomSheet效果的兩種實(shí)現(xiàn)方式

    Android BottomSheet效果的兩種實(shí)現(xiàn)方式

    這篇文章主要介紹了Android BottomSheet效果的兩種實(shí)現(xiàn)方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • Flutter 如何正確顯示SnackBar

    Flutter 如何正確顯示SnackBar

    Snackbar是Android支持庫中用于顯示簡單消息并且提供和用戶的一個簡單操作的一種彈出式提醒。當(dāng)使用Snackbar時,提示會出現(xiàn)在消息最底部,通常含有一段信息和一個可點(diǎn)擊的按鈕。本文主要介紹了Flutter 如何正確顯示 SnackBar
    2021-05-05
  • Android賬號注冊實(shí)現(xiàn)點(diǎn)擊獲取驗(yàn)證碼倒計時效果

    Android賬號注冊實(shí)現(xiàn)點(diǎn)擊獲取驗(yàn)證碼倒計時效果

    這篇文章主要為大家詳細(xì)介紹了Android賬號注冊過程中實(shí)現(xiàn)點(diǎn)擊獲取驗(yàn)證碼倒計時效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android控件CardView實(shí)現(xiàn)卡片布局

    Android控件CardView實(shí)現(xiàn)卡片布局

    這篇文章主要為大家詳細(xì)介紹了Android控件CardView實(shí)現(xiàn)卡片布局,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Android通過json向MySQL中讀寫數(shù)據(jù)的方法詳解【讀取篇】

    Android通過json向MySQL中讀寫數(shù)據(jù)的方法詳解【讀取篇】

    這篇文章主要介紹了Android通過json向MySQL中讀寫數(shù)據(jù)的方法,涉及Android解析json以及與php交互讀取mysql的方法,需要的朋友可以參考下
    2016-06-06

最新評論

潜山县| 尉氏县| 永年县| 宽甸| 托里县| 依安县| 兴业县| 东山县| 拜城县| 舒兰市| 宜章县| 光山县| 河西区| 土默特右旗| 青田县| 泾阳县| 万山特区| 巴南区| 临湘市| 丹阳市| 昭通市| 万载县| 尚义县| 长宁区| 儋州市| 上蔡县| 三门峡市| 阳春市| 宿州市| 集安市| 杭锦后旗| 通江县| 博野县| 怀安县| 章丘市| 灌云县| 鹤庆县| 常宁市| 高台县| 北流市| 阿克|