我有一个基于 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 上触发现有应用程序实例而不是浏览器中的新应用程序实例?