亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【Android Developers Training】 28. 將用戶帶

系統(tǒng) 2440 0

注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術(shù)一般,由于喜愛安卓而產(chǎn)生了翻譯的念頭,純屬個人興趣愛好。

原文鏈接: http://developer.android.com/training/basics/intents/sending.html


Android的一個最重的特性就是一個應(yīng)用可以將用戶帶領(lǐng)到另一個應(yīng)用的能力,這一切基于的是一個應(yīng)用期望表現(xiàn)的“ 行為(action) ”。例如,如果你的應(yīng)用有一個你期望顯示在地圖上的地址,你不需要在你的應(yīng)用中構(gòu)建一個顯示地圖的Activity,你只需要通過使用 Intent 來創(chuàng)建一個查勘地址的需求。之后Android系統(tǒng)會自動啟動一個可以在地圖上顯示地址的應(yīng)用。

如同在第一節(jié)課 Building Your First App (博客鏈接: http://www.cnblogs.com/jdneo/p/3438954.html )所說的,你必須使用intents在你的應(yīng)用的Activity之間轉(zhuǎn)換。一般你通過顯示intent來做這件事情,這將指明你希望啟動的組件的類名。然而,當(dāng)你希望通過另一個應(yīng)用執(zhí)行一個行為,比如“查看地圖”,你就必須使用一個隱式的intent。

這節(jié)課將向你展示如何為一個特定的行為創(chuàng)建一個隱式intent,以及如何使用它啟動一個其它應(yīng)用的Activity來執(zhí)行這個行為。

?

一). 構(gòu)建一個隱式的Intent

隱式Intent不聲明要啟動組件的類名,而是聲明一個要執(zhí)行的行為。該行為指定了你希望做的事情,比如查看,編輯,發(fā)送或者獲取某些東西。Intents也經(jīng)常包含與該行為有關(guān)的數(shù)據(jù),比如你希望查看的地址,或者你希望發(fā)送的郵件內(nèi)容。根據(jù)你希望創(chuàng)建intent,數(shù)據(jù)可以是一個 Uri ,也可以其他的數(shù)據(jù)類型,當(dāng)然intent也可以不需要任何數(shù)據(jù)。

如果你的數(shù)據(jù)是一個 Uri ,有一個你可以使用的 Intent() 構(gòu)造函數(shù)來定義行為和數(shù)據(jù)。

下述例子是如何使用 Uri 數(shù)據(jù)指定電話號碼來創(chuàng)建一個intent,從而初始化一個打電話行為

      Uri number = Uri.parse("tel:5551234"
      
        );

Intent callIntent 
      
      = 
      
        new
      
       Intent(Intent.ACTION_DIAL, number);
    

當(dāng)你的應(yīng)用通過調(diào)用 startActivity() 行使了這個intent,撥號應(yīng)用會根據(jù)給定的電話號碼初始化一個呼叫。

下面是一些其他intent的例子,以及它們所對應(yīng)的行為和 Uri 數(shù)據(jù)對:

  • 瀏覽地圖:
      
        //
      
      
         Map point based on address
      
      

Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"
      
        );


      
      
        //
      
      
         Or map point based on latitude/longitude


      
      
        //
      
      
         Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); 
      
      
        //
      
      
         z param is zoom level
      
      

Intent mapIntent = 
      
        new
      
       Intent(Intent.ACTION_VIEW, location);
    
  • 瀏覽一個網(wǎng)頁:
      Uri webpage = Uri.parse("http://www.android.com"
      
        );

Intent webIntent 
      
      = 
      
        new
      
       Intent(Intent.ACTION_VIEW, webpage);
    

其它類型的隱式Intents需要“ extra ”數(shù)據(jù)來提供不同的數(shù)據(jù)類型,比如字符串。你通過使用不同的 putExtra() 方法來添加一個或多個“ extra ”數(shù)據(jù)。

默認(rèn)的,系統(tǒng)會基于intent所包含的 Uri 數(shù)據(jù),來指定它所需要的恰當(dāng)MIME類型。如果你在intent中不包含一個 Uri ,你應(yīng)該使用 setType() 來指定與該intent所關(guān)聯(lián)的數(shù)據(jù)類型。設(shè)置MIME類型會進(jìn)一步特定什么類型的Activity將會接受這個intent。

下面是一些intent例子,它們通過添加額外的數(shù)據(jù)來定義希望的行為:

  • 發(fā)送一個有附件的Email:
      Intent emailIntent = 
      
        new
      
      
         Intent(Intent.ACTION_SEND);


      
      
        //
      
      
         The intent does not have a URI, so declare the "text/plain" MIME type
      
      
        emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);

emailIntent.putExtra(Intent.EXTRA_EMAIL, 
      
      
        new
      
       String[] {"jon@example.com"}); 
      
        //
      
      
         recipients
      
      

emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject"
      
        );

emailIntent.putExtra(Intent.EXTRA_TEXT, 
      
      "Email message text"
      
        );

emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(
      
      "content://path/to/email/attachment"
      
        ));


      
      
        //
      
      
         You can also attach multiple items by passing an ArrayList of Uris
      
    
  • 創(chuàng)建一個日歷事件:
      Intent calendarIntent = 
      
        new
      
      
         Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);

Calendar beginTime 
      
      = Calendar.getInstance().set(2012, 0, 19, 7, 30
      
        );

Calendar endTime 
      
      = Calendar.getInstance().set(2012, 0, 19, 10, 30
      
        );

calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());

calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());

calendarIntent.putExtra(Events.TITLE, 
      
      "Ninja class"
      
        );

calendarIntent.putExtra(Events.EVENT_LOCATION, 
      
      "Secret dojo");
    

Note:

這個日歷事件的Intent僅在API Level 14或更高的平臺上被支持。

Note:

將你的 Intent 定義的越明確越好!例如,如果你希望使用 ACTION_VIEW 的intent來展示一個圖片,你應(yīng)該特定MIME類型為“ image/* ”。這將防止可以查看其他數(shù)據(jù)類型的應(yīng)用(比如一個地圖閱覽器)被這個intent激活。

?

二). 確認(rèn)有一個應(yīng)用能接受此Intent

雖然Android平臺保證某個Intent將會由一個內(nèi)置的應(yīng)用所處理(比如:電話,電子郵件或者日歷等應(yīng)用),但是你在激活一個intent前包含一個確認(rèn)的步驟。

Caution:

如果你激活了一個在設(shè)備中沒有任何一個應(yīng)用能夠處理該事務(wù)的intent,那么你的應(yīng)用將會崩潰。

為了確認(rèn)有一個應(yīng)用能夠正確響應(yīng)這個intent,調(diào)用 queryIntentActivities() 來得到一個能夠處理你的 Intent 的activity清單。如果返回的 List 不為空,你可以安全地使用這個intent。例如:

      PackageManager packageManager =
      
         getPackageManager();

List
      
      <ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0
      
        );


      
      
        boolean
      
       isIntentSafe = activities.size() > 0;
    

如果 isIntentSafe為真,那就說明至少有一個應(yīng)用能夠正確響應(yīng)這個intent。如果為假,那就說明沒有任何應(yīng)用能夠處理這個intent。

Note:

你應(yīng)該在你的應(yīng)用第一次啟動時執(zhí)行這個檢查,這樣你就可以禁用使用該intent的功能特性,防止用戶嘗試去使用它。如果你知道某個特定的應(yīng)用能夠處理這個intent,你也可以給用戶提供鏈接來讓用戶下載這個應(yīng)用(可也查閱: link to your product on Google Play

?

三). 通過Intent啟動一個Activity

一旦你創(chuàng)建了你的 Intent 并且設(shè)置了額外的信息,你可以調(diào)用 startActivity() 將它發(fā)送給系統(tǒng)。如果系統(tǒng)發(fā)現(xiàn)有不止一個acitivity可以處理這個intent,它會向用戶顯示一個對話框,讓用戶選擇要啟動哪一個應(yīng)用,如圖1所示。如果只有一個應(yīng)用能夠處理這個intent,那么系統(tǒng)會立即直接啟動它。

      startActivity(intent);
    

圖1. 當(dāng)有多個應(yīng)用能夠處理該intent時,系統(tǒng)所顯示的選擇對話框

下面是一個完整的例子,它顯示了如何創(chuàng)建一個intent來瀏覽一個地圖,然后確認(rèn)是否存在應(yīng)用能夠處理它,然后啟動它:

      
        //
      
      
         Build the intent
      
      

Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"
      
        );

Intent mapIntent 
      
      = 
      
        new
      
      
         Intent(Intent.ACTION_VIEW, location);




      
      
        //
      
      
         Verify it resolves
      
      

PackageManager packageManager =
      
         getPackageManager();

List
      
      <ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0
      
        );


      
      
        boolean
      
       isIntentSafe = activities.size() > 0
      
        ;




      
      
        //
      
      
         Start an activity if it's safe
      
      
        if
      
      
         (isIntentSafe) {

    startActivity(mapIntent);

}
      
    

?

四). 顯示一個應(yīng)用選擇器(App Chooser)

注意到當(dāng)你將你的 Intent 傳遞給 startActivity() 來啟動一個Activity時,如果有多個應(yīng)用可以正確響應(yīng)這個intent,用戶可以選擇默認(rèn)使用哪個程序(在對話框底部勾選復(fù)選框,見圖1)。當(dāng)用戶每次都希望使用相同的應(yīng)用來處理該事務(wù)時(比如打開一個網(wǎng)頁時,用戶可能會喜歡只用一個瀏覽器,或者拍攝一個照片,用戶可能只喜歡用一款相機(jī)應(yīng)用),此時這么做是不錯的。

然而,如果這個intent行為可以被多個應(yīng)用處理,同時,用戶每次可能期望使用不同的應(yīng)用——比如“ 分享 ”這一行為,用戶可能有多個應(yīng)用能夠分享某一個項(xiàng)目。此時你應(yīng)該顯式地展現(xiàn)一個選擇應(yīng)用的對話框,如圖2所示。這個對話框強(qiáng)制用戶在每次執(zhí)行該操作時,選擇一個自己期望的應(yīng)用來處理該事務(wù)(用戶不能選擇一個默認(rèn)的應(yīng)用來處理)。

圖2. 一個應(yīng)用選擇器對話框

為了顯示一個選擇器,使用 createChooser() 來創(chuàng)建一個intent,并將它傳遞給 startActivity() ,例如:

      Intent intent = 
      
        new
      
      
         Intent(Intent.ACTION_SEND);

...




      
      
        //
      
      
         Always use string resources for UI text.


      
      
        //
      
      
         This says something like "Share this photo with"
      
      

String title =
      
         getResources().getString(R.string.chooser_title);


      
      
        //
      
      
         Create and start the chooser
      
      

Intent chooser =
      
         Intent.createChooser(intent, title);

startActivity(chooser);
      
    

這樣將會顯示一個對話框,里面顯示了能夠處理傳遞給 createChooser() 的intent的應(yīng)用清單,對話框的標(biāo)題是代碼中指定的文本。

【Android Developers Training】 28. 將用戶帶領(lǐng)到另一個應(yīng)用


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 中文字幕在线观看第二页 | 九色视频极品论坛区 | 久久精品亚洲99一区二区 | 精品久久精品久久 | 日韩欧美一级毛片在线 | 自拍偷自拍亚洲精品被多人伦好爽 | 91精品国产色综合久久 | 一级aa 毛片高清免费看 | 加勒比色综合 | 韩日性视频 | 特黄日韩免费一区二区三区 | 日韩精品欧美高清区 | 伊人久久大香焦 | 亚洲欧洲精品视频在线观看 | 国产在线观看99 | 国产成人18黄网站免费 | 久久婷婷成人综合色 | 欧美中文网 | 欧美图片一区二区三区 | 中文字幕一区二区日产乱码 | 欧美α片无限看在线观看免费 | 九九爱国产 | 亚洲无卡视频 | 77奇米影视 | 国内精品欧美久久精品 | 亚洲国产精品综合福利专区 | 精品无人区乱码1区2区3区免费 | 91精品视频在线看 | 一级床上爽高清播放 | a网在线| 免费看一级黄色录像 | 久久国产偷 | 久久乱码精品区中文字幕 | 免费在线观看黄色的网站 | 国产乱叫456在线 | 亚洲综合日韩欧美一区二区三 | 天天躁狠狠躁夜躁2021 | 性色网站| 国产51自产区在线 | 日本不卡中文字幕 | 久久久久久天天夜夜天天 |