2012-09-07 18 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

相关问题