4

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

因此,我的 PhoneGap 应用程序启动,执行它的操作,然后调用浏览器应用程序到远程网页(通过navigator.app.loadUrl('http://example.com/')window.open('http://example.com/'))。浏览器中该远程网页上的链接 ( myprotocol://do/stuff) 将通过数据方案的意图过滤器。通过 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 上看到的奇怪问题是,当触发了意图过滤器时,它会启动应用程序的新视图,并在 Android浏览器中。我可以看到它重新加载了 html 页面。它不会按预期将现有的应用程序实例带到前台。查看 logcat 我发现这实际上是相同的 I/Web 控制台进程,但它再次加载了 html。没有“Start proc”的新日志。

奇怪的是,我现在在任务管理器中显示了我的应用程序的两个实例。原始应用程序实例仍然存在,带有我的自定义应用程序图标。浏览器进程有自己的浏览器应用程序图标,但显然正在运行我的应用程序 UI。我可以单独切换每个 webview 并与之交互。几乎就像我的进程现在有两个 web 视图 - 一个在应用程序中,第二个 web 视图现在在 Browser 进程中运行。

我目前在 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 上会调用。

我在以这种方式连接意图过滤器时做错了什么吗?

如何在现有的 Android 4.x 上触发现有应用程序实例而不是浏览器中的新应用程序实例?

4

1 回答 1

4

使用android:launchMode="singleTask"而不是android:launchMode="singleTop"活动为我的场景解决了这个问题。

看来 HTC 只是以不同于默认 Android 的方式处理这个问题。

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

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

于 2012-09-28T16:15:19.743 回答