2

我可以在这里阅读有关如何在连接 USB 附件时启动我的应用程序的信息,并且一切正常:我的清单中内置了一个 IntentFilter,每次连接指定的附件时都会启动适当的活动。看起来是这样的:

<activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:exported="true">
        <intent-filter>
            <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
        </intent-filter>

        <meta-data
            android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
            android:resource="@xml/accessory_filter" />
</activity>

但是,如果在连接附件时我的 Activity 已经在运行,我会遇到问题。在 MainActivity 中,我在两个地方查找 USB_ACCESSORY_ATTACHED Intent:onCreate 和 onNewIntent,如下所示:

protected void onCreate(Bundle savedInstanceState) {
    //Check for some other actions first
    if (UsbManager.ACTION_USB_ACCESSORY_ATTACHED.equals(intent.getAction()))
        usbAttached(intent);

}
protected void onNewIntent(Intent intent) {
    if (UsbManager.ACTION_USB_ACCESSORY_ATTACHED.equals(intent.getAction()))
        usbAttached(intent);
}

但是,如果 MainActivity 已经在运行,则在插入附件时不会调用 onCreate 和 onNewIntent。在这种情况下,我需要在插入配件之前关闭我的应用程序,这对用户来说会很麻烦。如果我的活动已经在运行,那么从我的 USB 配件接收 Intent 的适当方式是什么?我需要在活动本身内实现一个单独的侦听器吗?

4

2 回答 2

0

如果您查看onNewIntent()它的文档,请阅读:

protected void onNewIntent(意图意图)

在 API 级别 1 中添加了
在其包中将 launchMode 设置为“singleTop”的活动,或者如果客户端在调用 startActivity(Intent) 时使用了 FLAG_ACTIVITY_SINGLE_TOP 标志,则调用此方法。在任何一种情况下,当活动在活动堆栈的顶部而不是正在启动的活动的新实例时重新启动时,onNewIntent() 将在具有用于重新启动的 Intent 的现有实例上调用它。
...

所以你需要在你的清单中设置launchMode你的Activityto singleTop,否则你将不会收到对 的调用onNewIntent()。结果应如下所示:

<activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:launchMode="singleTop"
        android:exported="true">
           ... 
</activity>

如果你仔细想想,这种行为实际上很有意义。下次在这里提问之前先看看文档。如果你不知道,不要假设事情是如何运作的。

于 2016-01-21T18:17:55.010 回答
-1

通过 编写一个BroadcastReceiver并将其注册到您的活动生命周期方法中Context.registerReceiver(...)。不要忘记在相应的拆卸生命周期方法中取消注册它。

于 2016-01-21T18:10:35.507 回答