【发布时间】:2012-09-07 16:46:16
【问题描述】:
我有一个基于 Cordova/PhoneGap 2.0 的 Android 应用程序,我正在尝试使用意图过滤器来注册自定义协议处理程序。
所以我的 PhoneGap 应用程序启动,执行它的操作,然后调用浏览器应用程序到远程网页(通过 navigator.app.loadUrl('http://example.com/') 或 window.open('http://example.com/'))。浏览器中该远程网页上的链接 (@987654323 @) 将通过数据方案的意图过滤器将我的应用程序带回前台。通过 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 上看到的奇怪问题是,当触发了意图过滤器时,它会启动应用程序的新视图,并且 IN 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 上,如何触发现有应用实例而不是浏览器中的新应用实例?
【问题讨论】:
标签: android cordova intentfilter cordova-2.0.0