我有一个基于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实例,而不是浏览器中的新实例?
答案 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”在这里解决了这个问题。