2012-09-07 16 views
4

我有一個基於Cordova/PhoneGap 2.0的Android應用程序,我試圖使用intent-filters來註冊一個自定義協議處理程序。Android PhoneGap intent-filter,瀏覽器回調到正在運行的應用程序?

所以我的PhoneGap應用程序啓動,就執行了,再後來調出通過navigator.app.loadUrl('http://example.com/')window.open('http://example.com/'))瀏覽器應用程序的遠程Web頁面(即遠程Web頁面上的瀏覽器(myprotocol://do/stuff)的鏈接將帶來我的通過WebIntents插件,我可以在我的應用程序中獲取並分析這個URL。

這是在Android 4.0.4上使用HTC One X(和因此是'Sense'版本的Android)

相同的代碼在Galaxy Nexus上的Android 4.0.4或4.1.1或Nexus S上的4.0.1上不起作用。

我在「stock」Android上看到的奇怪問題是,在意圖過濾器被觸發時,它會啓動應用程序的新視圖,並在Android瀏覽器中啓動新的視圖。我可以看到它重新加載了html頁面。它不會像預期的那樣將現有的應用程序實例帶到前臺。看看logcat,我看到這實際上是相同的I/Web控制檯進程,但它再次加載了html。沒有「Start proc」的新日誌。

奇怪的是,我現在有兩個我的應用程序顯示在任務管理器中的實例。原來的應用程序實例仍然存在與我的自定義應用程序圖標。瀏覽器進程有自己的瀏覽器應用程序圖標,但顯然運行我的應用程序用戶界面。我可以切換並分別與每個webview進行交互。這幾乎就像我的過程現在有兩個Web視圖 - 一個在應用程序中,另一個在瀏覽器進程中運行。

我現在有這樣的事情在AndroidManifest.xml:

<activity android:name="MyApp" android:label="@string/app_name" 
      android:screenOrientation="portrait" 
      android:launchMode="singleTop" 
      android:configChanges="orientation|keyboardHidden"> 

    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 

    <intent-filter> 
     <data android:scheme="myprotocol" /> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 

</activity> 

我的應用程序使用插件的WebIntent和NFC插件,但我也看到了同樣的問題,而不他們。我也在PhoneGap 1.8.1和1.9.0中轉載了這個問題。

我也可以通過日誌記錄看到,對於HTC而言,DroidGap.onCreate()在意圖被觸發時不會被調用,而是在Nexus上觸發。

我正在做一些不正確的事情,以這種方式連接intent-filter嗎?

如何觸發現有的應用程序實例被調用,而不是在瀏覽器中的新的,在股票Android 4.x?

回答

4

使用android:launchMode="singleTask"而不是android:launchMode="singleTop"來解決這個問題。

看來,HTC只是處理這個不同於默認的Android應該。

閱讀 http://developer.android.com/guide/components/tasks-and-back-stack.html 和觀看如何,例如谷歌股票的Android Play商店應用是由瀏覽器發起(瀏覽器,在任務列表)表示,我看到的行爲的目的,如果一個位混亂。

我只有一個活動,並打算只有一個我的應用程序的實例,所以「singleTask」在這裏解決了這個問題。

+0

我有同樣的問題,這也解決了我,所以謝謝。我可以問:你有選擇singleTask而不是SingleInstance的原因嗎?兩者似乎都適合我。 – jackocnr

+0

「singleTask」適用於我的啓動,但數據似乎會傳回給應用程序(GoogNexus,KitKat) – ericpeters0n

相關問題