Android PhoneGap意图过滤,浏览器回调正在运行的应用程序?

时间:2012-09-07 16:46:16

标签: android cordova intentfilter cordova-2.0.0

我有一个基于Cordova / PhoneGap 2.0的Android应用程序,我正在尝试使用intent-filters来注册自定义协议处理程序。

所以我的PhoneGap应用程序启动,完成它的工作,然后调用浏览器应用程序到远程网页(通过navigator.app.loadUrl('http://example.com/')window.open('http://example.com/'))。该远程网页上的链接浏览器(myprotocol://do/stuff)将通过数据方案的intent-filter将我的应用程序带回前台。通过WebIntents插件,我可以在我的应用程序中获取并解析此URL。

这适用于HTC One X上的Android 4.0.4(因此也是Android的'Sense'版本)。

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

我在“股票”Android上看到的奇怪问题是,当触发intent-filter时,它会启动应用程序的新视图,并启动 IN Android浏览器。我可以看到它重新加载html页面。它没有按预期将现有的应用程序实例带到前台。看看logcat,我看到这实际上是同一个I / Web Console进程,但是它再次加载了html。没有新的“Start proc”日志。

奇怪的是,我现在在任务管理器中显示了我的应用程序的两个实例。原始应用实例仍然存在我的自定义应用图标。浏览器进程有自己的浏览器应用程序图标,但显然正在运行我的应用程序UI。我可以单独切换和与每个webview交互。这几乎就像我的流程现在有两个Web视图 - 一个在应用程序中,另一个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>

我的应用程序正在使用WebIntents插件和NFC插件,但如果没有它们,我也会看到同样的问题。我也在PhoneGap 1.8.1和1.9.0中重现了这个问题。

我还可以通过日志记录看到,对于HTC,DroidGap.onCreate()在触发意图时不会被调用,但在Nexus上它会被调用。

我是否在通过这种方式连接intent-filter时做错了什么?

如何在Android 4.x股票上触发现有的app实例,而不是浏览器中的新实例?

1 个答案:

答案 0 :(得分:4)

使用android:launchMode="singleTask"而不是android:launchMode="singleTop"进行活动解决了这个问题。

似乎HTC只是处理这个问题而不是默认的Android应该。

阅读 http://developer.android.com/guide/components/tasks-and-back-stack.html 并查看例如Google Play商店应用程序是如何通过浏览器(浏览器中,在任务列表中)在Android上显示的,表示我看到的行为是有意的,如果有点混乱。< / p>

我只有一个活动,并打算只有我的应用程序的单个实例,所以“singleTask”在这里解决了这个问题。