【问题标题】:Android PhoneGap intent-filter, Browser calling back to running app?Android PhoneGap 意图过滤器,浏览器回调正在运行的应用程序?
【发布时间】: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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我遇到了同样的问题,这也为我解决了,所以谢谢。请问:您选择 singleTask 而不是 singleInstance 有什么原因吗?两者似乎都对我有用。
    • "singleTask" 为我工作启动,但数据似乎被传递回应用程序(GoogNexus,KitKat)
    猜你喜欢
    • 1970-01-01
    • 2022-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2011-10-26
    • 2016-09-23
    相关资源
    最近更新 更多