【问题标题】:How can I make sure Android Beam doesn't start a new instance of my 'singleTop' activity?如何确保 Android Beam 不会启动我的“singleTop”活动的新实例?
【发布时间】:2012-03-10 04:27:41
【问题描述】:

首先,用例:两部手机在同一个屏幕上打开了我的应用程序。我希望一个用户能够与另一个用户共享屏幕内容(数据),而不必在使用 NFC 发送时打开新的活动实例。 (两台 Android 设备都运行 Ice Cream Sandwich)

所以我在清单中有一个像这样声明的 singleTop 活动。

<activity android:name=".activity.MyActivity" android:configChanges="orientation|keyboardHidden" android:launchMode="singleTop">
  <intent-filter android:label="@string/activityLabel">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="a.b.c/x.y.z" />
  </intent-filter>
  <intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="application/x.y.z"/>
  </intent-filter>
</activity>

当触发VIEW 操作并且活动已在顶部时,如果活动已在相同 实例中调用onNewIntent() 方法。

当触发NDEF_DISCOVERED 操作并且活动已经在顶部时,onCreate() 方法会在活动的 实例中调用。

【问题讨论】:

    标签: android android-intent android-activity nfc android-beam


    【解决方案1】:

    您描述了应用程序已经打开并且正确的 Activity 位于前台的情况。在这种情况下,您可以通过调用 Activity 的 onResume() 中的 NfcAdapter.enableForegroundDispatch()(和 onPause() 中的 disableForegroudDispatch())来使用 NFC 意图的前台调度。这将强制将所有 NFC Intent 传递到您的 Activity(通过 onNewIntent())。

    【讨论】:

    • 这看起来像是要走的路,但我现在没有第二个支持 NFC 的设备来测试它。文档:developer.android.com/guide/topics/nfc/…
    • 使用带有 NDEF 消息的 NFC 标签与通过 Android Beam 接收数据的结果几乎相同。也许你可以试试。
    【解决方案2】:

    我没有给你的答案。但我有一个解决方法:让 NDEF_DISCOVERED 开始一项新活动。使该活动不可见 (Theme.NoBackground) 并在 onCreate 中,使其使用 singleTop 启动 MyActivity 并立即完成。 MyActivity 现在应该与 onNewIntent 一起出现。

    【讨论】:

      【解决方案3】:

      您是否查看过 Android Beam 示例:

      http://developer.android.com/resources/samples/AndroidBeamDemo/index.html

      它实现了您想要的这种行为(减去 VIEW 意图过滤)。我不确定该意图是否会影响 NDEF_DISCOVERED ,但也许修改 Android Beam 示例以查看您是否会导致与您的应用相同的行为会很有趣。

      【讨论】:

      • 我查看了 Android Beam 示例(实际上是由此开始的),它没有实现我在这里尝试实现的前台调度。
      【解决方案4】:

      你应该使用:android:launchMode="singleInstance" 对我有用。

      【讨论】:

      • launchMode "singleInstance" 仅用于主屏幕更换。在我的情况下,“singleTask”工作得很好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      相关资源
      最近更新 更多