记住USB连接,但不要启动应用程序

时间:2013-08-05 13:05:09

标签: android

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

此外,它现在还记住了不同发布中的设备,如以下线程storing usb default connections中所述。

但是,这会在连接USB设备时始终启动活动时产生不良影响。没有启动应用程序,我无法记住默认值。在连接上启动应用程序不是一个理想的效果。下面的小代码示例是清单当前的样子,以便快速浏览存储在内存中的默认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>

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

更新

声明清单中服务或接收器内usb设备连接的意图也是存储连接信息的尝试。但是,只有活动中的意图才会记住连接状态,因此在以后的给定时间点重新连接时,不需要询问用户。它看起来好像只是为了节省状态与连接时启动应用程序相结合。有点奇怪,但没有解决方法获得无启动与记住USB连接设备的默认连接。

3 个答案:

答案 0 :(得分: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活动也很有用。

答案 1 :(得分:2)

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

创建一个Service并在此服务中运行“当USB设备连接时”等逻辑(可能您现在已在该活动中使用它们)。

顺便说一下,您可以随时使用此服务中的MainActivity

答案 2 :(得分:1)

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

为了避免活动的推出,我实施了 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()方法对我来说似乎更安全。