我正在处理的应用程序通过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连接设备的默认连接。
答案 0 :(得分:3)
您不必始终启动活动。您可以让后台服务静静地处理意图。
<service android:name=".MyService">
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
</service>
更新
您可能必须明确请求某些权限。这是你应该做的:
答案 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()方法对我来说似乎更安全。