如果应用程序已在运行,如何在连接USB附件时接收Intent

时间:2016-01-21 17:59:47

标签: android android-intent android-usb

我能够阅读here关于如何在连接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的适当方法是什么?我是否需要在活动本身内实现一个单独的监听器?

2 个答案:

答案 0 :(得分:0)

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

  

protected void onNewIntent(Intent intent)

     

在API级别1中添加   这被称为将launchMode设置为&#34; singleTop&#34;在他们的包中,或者如果客户端在调用startActivity(Intent)时使用了FLAG_ACTIVITY_SINGLE_TOP标志。在任何一种情况下,当在活动堆栈的顶部而不是正在启动的活动的新实例重新启动活动时,将在现有实例上使用用于重新启动的Intent调用onNewIntent()它。
  ......

因此,您需要在清单中将launchMode的{​​{1}}设置为Activity,否则您将不会收到singleTop的来电。结果应如下所示:

onNewIntent()

如果你认为这种行为实际上很有意义。下次在问这里之前先查看文档。如果你不知道,不要假设这些东西是如何运作的。

答案 1 :(得分:-1)

撰写Ok(Json.obj({"success": true})) 并通过Context.registerReceiver(...)将其注册到您的活动生命周期方法中。不要忘记在相应的拆解生命周期方法中取消注册它。