android隱式調用
⑴ Android APP調起另外一個APP並傳值
第一種:
第二種:
setClassName內部也是調用的setComponent。
調用方:
被調用方在AndroidManifest的Activity中添加自定義action:
被調用方數據接收:
第一種:
調用方通過點擊H5網頁上按鈕
這種方法存在著弊端就是沒辦法判斷手機上是否安裝APP時,更適合打開自己APP中Activity。一般建議js與java進行交互調用原生的方法: WebViewJavascriptBridge 使用簡單方便,並且避免了一些js腳本注入漏洞。
第二種:隱式調用
被調用方在AndroidManifest的Activity中添加自定義action:
被調用Activity中數據接收:
注意: 這兩種方式只適合針對某個頁面,都只是在自己應用中跳轉第三方應用,並不是真正的喚醒,比如應用A已經在後台存在了,應用B調用以上兩種方式後,只是在應用B中重新打開了一個應用A,此時的應用A是相當與存在兩個,一個是在後台單獨存在,一個是依存應用B存在,是添加到應用B的棧中的,當點擊A頁面裡面的跳轉按鈕時才真正調起跳轉到A應用。
⑵ android 顯示intent和隱士inent的區別
以下內容為CSDN上(網名:yuan1590)對安卓顯示意圖和隱身意圖的總結(ps前人種樹,樹,後人乘涼,所以我就粘過來了,希望幫到您):
1. Intent
Android基本的設計理念是鼓勵減少組件間的耦合,因此Android提供了Intent (意圖) ,
Intent提供了一種通用的消息系統,它允許在你的應用程序與其它的應用程序間傳遞 Intent 來執行動作和產生事件。
使用 Intent 可以激活 Android 應用的三個核心組件:活動(Activity)、服務(Service)和廣播接收器(BroadcastReceiver)。
2. 顯式意圖、隱式意圖
Intent可以劃分成顯式意圖和隱式意圖。
顯式意圖:調用Intent.setComponent() 或 Intent.setClassName() 或 Intent.setClass()方法明確指定了組件名的Intent為顯式意圖,顯式意圖明確指定了Intent應該傳遞給哪個組件。
如: 在 MainActicity 中打開一個新的 Acticity -- OtherActivity
1. Intent intent = new Intent();
2. intent.setComponent(new ComponentName(MainActivity.this, OtherActivity.class));
3. 第二行代碼可以更換為:intent.setClass(MainActivity.this, OtherActivity.class);
4. 也可以使用構造器來指定組件: Intent intent = new Intent(MainActivity.this, OtherActivity.class)
三種 「顯式意圖」 指定方式等價
隱式意圖:沒有明確指定組件名的Intent為隱式意圖。
Android系統會根據隱式意圖中設置的動作(action)、類別(category)、數據(data: URI和數據類型)找到最合適的組件來處理這個意圖
例如撥打電話的意圖:
Uri uri = Uri.parse("tel:" + phoneCode);
Intent intent = new Intent(Intent.ACTION_CALL, uri);
對於隱式意圖,Android是怎樣尋找到這個最合適的組件呢?記的前面我們在定義活動時,指定了一個intent-filter,Intent Filter(意圖過濾器)其實就是用來匹配隱式Intent的,當一個意圖對象被一個意圖過濾器進行匹配測試時,只有三個方面會被參考到:動作、數據(URI以及數據類型)和類別。
動作測試(Action test)
一個意圖對象只能指定一個動作名稱,而一個過濾器可能列舉多個動作名稱。如果意圖對象或過濾器沒有指定任何動作,結果將如下:
+ 如果過濾器沒有指定任何動作,那麼將阻塞所有的意圖,因此所有的意圖都會測試失敗。沒有意圖能夠通過這個過濾器。
<intent-filter><!-- 空的 --></intent-filter>
+ 另一方面,只要過濾器包含至少一個動作,一個沒有指定動作的意圖對象自動通過這個測試
類別測試(Category test)
對於一個能夠通過類別匹配測試的意圖,意圖對象中的類別必須匹配過濾器中的類別。這個過濾器可以列舉另外的類別,但它不能遺漏在這個意圖中的任何類別。
原則上一個沒有類別的意圖對象應該總能夠通過匹配測試,而不管過濾器里有什麼。大部分情況下這個是對的。
但有一個例外,Android把所有傳給startActivity()的隱式意圖當作他們包含至少一個類別:"android.intent.category.DEFAULT" (CATEGORY_DEFAULT常量)。
因此自定義 Activity 的時候,不要以為光定義一個 action 就夠了。這樣用 startActivity() 來激活這個 Activity 的時候將一直報錯。
原因就是,他內部要求去匹配 android.intent.category.DEFAULT 這個類別。
因此,想要接收隱式意圖的活動必須在它們的意圖過濾器中包含"android.intent.category.DEFAULT"。
(帶"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"設置的過濾器是例外)
數據測試(Data test)
當一個意圖對象中的URI被用來和一個過濾器中的URI比較時,比較的是URI的各個組成部分。
例如,如果過濾器僅指定了一個scheme,所有該scheme的URIs都能夠和這個過濾器相匹配;
如果過濾器指定了一個scheme、主機名但沒有路經部分,所有具有相同scheme和主機名的URIs都可以和這個過濾器相匹配,而不管它們的路經;
如果過濾器指定了一個scheme、主機名和路經,只有具有相同scheme、主機名和路經的URIs才可以和這個過濾器相匹配。
當然,一個過濾器中的路徑規格可以包含通配符,這樣只需要部分匹配即可。
數據測試同時比較意圖對象和過濾器中指定的URI和數據類型。規則如下:
a. 一個既不包含URI也不包含數據類型的意圖對象僅在過濾器也同樣沒有指定任何URIs和數據類型的情況下才能通過測試。
b. 一個包含URI但沒有數據類型的意圖對象僅在它的URI和一個同樣沒有指定數據類型的過濾器里的URI匹配時才能通過測試。
這通常發生在類似於mailto:和tel:這樣的URIs上:它們並不引用實際數據。
c. 一個包含數據類型但不包含URI的意圖對象僅在這個過濾器列舉了同樣的數據類型而且也沒有指定一個URI的情況下才能通過測試。
d. 一個同時包含URI和數據類型(或者可從URI推斷出數據類型)的意圖對象可以通過測試,如果它的類型和過濾器中列舉的類型相匹配的話。
如果它的URI和這個過濾器中的一個URI相匹配或者它有一個內容content:或者文件file: URI而且這個過濾器沒有指定一個URI,那麼它也能通過測試。
換句話說,一個組件被假定為支持content:和file: 數據如果它的過濾器僅列舉了一個數據類型。
⑶ 如何使用ContentProvider類實現隱式Intent
舉例說明:
1、定義對應的ContentProvider類TestProvider,繼承ContentProvider。
類裡面需要實現一系列的abstract方法,如:OnCreate,getType,insert…
2、在應用程序的AndroidManifest.xml中加入<provider>標簽,例如:
<provider android:name="TestProvider"
android:authorities="com.android.test.settings"/>
android:name是指對應ContentProvider的類名,也就是所建的TestProvider類
android:authorities是標識部分,為了保證唯一性,這里使用完整的包名和類名
3、在想要調用的activity所對應應用的AndroidManifest.xml中,把該activity的intent-filter添加上對Data的要求
4、在StartActivity(intent)之前,設定該intent對應的action(調用setAction()指定)和data(調用setData(Uri.parse(content:// com.android.test.settings /test)))。StartActivity之後,Android系統內部就會根據上面Uri裡面的com.android.test.settings,去找到對應的TestProvider(根據android:authorities),然後再調用getType方法。這樣Android系統會根據getType返回的數據類型,以及intent在setAction時制定的action,去啟動對應的Activity
⑷ Android 跨應用間調用: URL Scheme
Android中的自定義的 URL Scheme 是一種頁面內跳轉協議,也可以被稱為 URLRouter ,就是通過類似打開網頁的方式去通過路由打開一個Activity,而非直接通過顯式Intent方式去進行跳轉。這樣隱式intent的方法跳轉好處如下:
上文已經說過, URL Scheme 是就通過類似打開網頁的方式去通過路由打開一個Activity,其協議格式和我們打開網頁輸入的網址類似。
一個完整的完整的URL Scheme協議格式由scheme、host、port、path和query組成,其結構如下所示:
其中scheme既可以是Android中常見的協議,也可以是我們自定義的協議。Android中常見的協議包括content協議、http協議、file協議等,自定義協議可以使用自定義的字元串,當我們啟動第三方的應用時候,多是使用自定義協議。
如下是一個自定義協議的URI:
通過上面的路徑 Scheme、Host、port、path、query全部包含:
URL Scheme 的使用方法簡要言之就是先在manifest中配置能接受Scheme方式啟動的activity;當需要調用時,將Scheme協議的URi以Data的形式加入到Intent中,隱式調用該activity。
1). 在AndroidManifest.xml中對<activity >標簽增加<intent-filter>設置Scheme
上面的設置中可以看到,MainActivity包含多個<intent-filter>設置,第一個是正常的啟動,也就是在應用列表中啟動;第二個是通過 URL Scheme 方式啟動,其本身也是隱式Intent調用的一種,不同在於添加了<data>屬性,定義了其接受 URL Scheme 協議格式為 urlschemel://auth_activity
這里需要說明下, URL Scheme 協議格式中,組成URI的這些屬性在<data >標簽中都是可選的 ,但存在如下的依賴關系:
當我們將intent對象中的Uri參數與intent-filter中的<data>標簽指定的URI格式進行對比時,我們只對比intent-filter的<data>標簽指定的部分,例如:
需要注意的是,intent-filter的<data>標簽在指定path的值時,可以在裡面使用通配符*,起到部分匹配的效果。
2). 使用URL啟動Activity
當然可以在網頁中調用
或者是在JS中調用
3.)如何判斷URL Scheme是否有效
有時候需要把一些輔助性的、較為獨立的APP在Home Launcher中隱藏起來,只允許一些特定的APP調用。這個時候,我們可以利用 URL Scheme 協議來做到這一點,設置AndroidManifest.xml中對<activity >標簽如下
因為Home Launcher列出的應用圖標要求必須有Activity同時滿足
上面的配置中有多餘的category和data限制存在,所以並不匹配,不會在Home Launcher出現,但是可以使用 URL Scheme 來啟動。
這樣就可以將一組APP設置一個統一的入口,然後根據實際需要在調用不同子APP,即所謂的 APP業務組件化 , URL Scheme 在其中有著重要的作用,更進一步討論會在以後的文章中呈現,敬請期待。
參考文獻:
http://blog.csdn.net/iispring/article/details/48481793
http://blog.csdn.net/hb707934728/article/details/53196419
http://www.cnblogs.com/whoislcj/p/5825333.html
⑸ android 為什麼採用intent 進行數據交互
Android系統的一個重要特性就是一個應用程序可以調用另外一個應用程序來完成用戶的請求動作。比如你的應用程序需要給用戶顯示一個地理位置在地圖上,你不必在你的應用程序中實現地圖功能,而是創建一個顯示這個地理位置的Intent,發送出去,Android系統會啟動那些可以處理這個請求的應用程序。還比如:你用網路雲盤下載了一個pdf文檔,你在點擊打開這個文檔的時候網路雲盤是無法打開的,但是也許你系統上安裝有其他的能打開pdf文檔的閱讀器,這個時候就會彈出一個對話框,列舉了可以打開pdf文檔的應用程序,你可以自由選擇一個應用程序打開你下載的文檔。
使用隱式Intent:
隱式Intent不會指明要啟動的組件名稱,而是聲明執行的動作,動作指定了你想要做什麼事情,比如顯示(view),編輯(edit),發送(send),獲取一些東西(get something)等。Intent經常會附帶一些數據,比如你要查看的地址,發送郵件的內容等。數據形式依賴於你想要做什麼事情,數據可以是一個Uri,也可以是其他數據類型(基本數據類型或者對象)之一。數據不是必須的,你的Intent中可以不包含data。
⑹ 如何在Android中調用瀏覽器打開網頁
在安卓代碼中我們有時需要調用瀏覽器來打開相應的網頁,此時可以有以下幾種實現方式:
一:
調用默認瀏覽器
Intent intent = new Intent(); //Intent
intent = new Intent(Intent.ACTION_VIEW,uri);
intent.setAction("android.intent.action.VIEW"); Uri content_url = Uri.parse("此處填鏈接"); intent.setData(content_url); startActivity(intent);
其他瀏覽器
Intent intent = new Intent(); //Intent
intent = new Intent(Intent.ACTION_VIEW,uri); intent.setAction("android.intent.action.VIEW"); Uri content_url = Uri.parse("此處填鏈接"); intent.setData(content_url); intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");
startActivity(intent);
uc瀏覽器":"com.uc.browser", "com.uc.browser.ActivityUpdate「opera:"com.opera.mini.android", "com.opera.mini.android.Browser"qq瀏覽器:"com.tencent.mtt", "com.tencent.mtt.MainActivity"
二:
1、自定義一個簡單的WebView瀏覽器,設置下面屬性:
mWebView = (ProgressWebView) findViewById(R.id.baseweb_webview); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.setWebViewClient(new WebViewClient());
2、指定需要打開的額網頁,在自定義的WebViewActivity中打開,如:
WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.loadUrl("http://www.hao123.com");
3、還可以查看相關的自定義WebView簡單瀏覽器的Demo,《WebView控制項實現的簡單瀏覽器效果》,以及對應的TeachCourse介紹怎麼使用