4

我正在处理的应用程序通过 USB 连接成功连接到设备。

此外,它现在可以记住来自不同启动的设备,正如以下存储 USB 默认连接的线程中所指出的那样。

但是,这会留下在连接 USB 设备时始终启动 Activity 的不良影响。如果不启动应用程序,我无法记住默认设置。在连接上启动应用程序不是预期的效果。下面的小代码示例是清单当前的样子,以便将默认的 USB 连接存储在内存中,以便快速浏览未来的连接。可以在不启动应用程序的情况下完成这种默认值存储吗?

<activity
     android:name="com.MainScreen"
     android:theme="@style/Theme.Default"
     android:configChanges="orientation|keyboardHidden|screenSize"
     android:label="@string/app_name">  
     <intent-filter>
        <action  android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
     </intent-filter>
     <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                android:resource="@xml/device_filter" />
</activity>

我一直在想,也许有一种类别可以添加到意图过滤器中,将其指定为不可启动的意图。在活动期间被监听但由活动处理的东西。到目前为止,我还没有找到这个。

更新:

在清单中的服务或接收器中声明 USB 设备连接的意图也是一种存储连接信息的尝试。但是,只有 Activity 中的 Intent 会记住连接状态,因此在稍后给定的时间点重新连接时,它不需要询问用户的后续时间。它看起来好像只是为了保存状态并在连接时启动应用程序。有点奇怪,但没有解决方法来获得不启动并记住 USB 连接设备的默认连接。

4

3 回答 3

3

您不必总是启动活动。您可以让后台服务安静地处理意图。

<service android:name=".MyService">
     <intent-filter>
          <action  android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
     </intent-filter>
</service>

更新:

您可能必须明确请求某些权限。这是你应该做的:

  1. 当用户安装应用程序并首次打开时,请求 USB 相关权限。
  2. 如上所述设置服务来处理 USB 连接事件。连接后,只要连接了已识别的设备,就会在状态栏中显示持久通知。
  3. 状态栏通知还有助于通知用户需要更多权限并且可以访问主 UI 活动。
于 2013-08-05T13:28:11.583 回答
2

你应该做一个小的重新设计。

在此服务中创建Service并运行“当连接 USB 设备时”等逻辑(可能您现在在该 Activity 中拥有它们)。

顺便说一句,您始终可以MainActivity在此服务之外或之外充分利用您的服务。

于 2013-08-05T13:30:38.370 回答
1

我可以通过自己的实验确认 USB 设备不会在服务中被记住。似乎 requestPermission() 必须来自一个活动。

为了避免启动活动,我像这样实现了 onPostCreate()

@Override // from Activity
public void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);

    Intent triggerIntent = getIntent();
    if (triggerIntent != null) {
        if ( ! triggerIntent.hasCategory(Intent.CATEGORY_LAUNCHER) ) {
            Log.e(LOGTAG, "not started by launcher! exit now.");
            finish();
        }
    }
}

我使用 onPostCreate() 而不是将代码粘贴到 onCreate() 中,因为当从 onCreate() 调用 finish() 时,它会导致 onDestroy() 立即被调用,并且通常并非 Activity 类的所有成员都已正确设置。使用 onPostCreate() 方法对我来说似乎更安全。

于 2017-01-02T22:45:27.270 回答