У меня есть приложение, которое использует проприетарное устройство USB (андроид в режиме хоста).Android Usb Host, singleInstance, onCreate продолжает получать вызовы с USB-подключением
У меня есть BroadcastReceiver
, который я зарегистрироваться в конструкторе
// this block is in the constructor
usbConnectionReceiver = new UsbConnectionReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
context.registerReceiver(usbConnectionReceiver, filter);
public class UsbConnectionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (device != null) onDeviceAttached(device);
} else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (device != null) onDeviceDetached(device);
}
}
}
public void onDeviceAttached(UsbDevice device) {
usbDevice = device;
intf = usbDevice.getInterface(0);
endpoint = intf.getEndpoint(0);
if (usbManager.hasPermission(usbDevice)) {
usbDeviceConnection = usbManager.openDevice(usbDevice);
boolean status = usbDeviceConnection.claimInterface(intf, true);
if (status) {
startPollingThread();
}
} else {
// I used to have code here that would programmatically prompt for permissions.
}
}
Все прекрасно работает, за исключением того, что каждый раз, когда устройство отключил и снова, конечный пользователь должен ввести разрешения. Флажок «Использовать по умолчанию для этого устройства USB» полностью игнорируется.
После некоторых исследований выяснилось, что если я прошу разрешения через код, это действительно так.
Поэтому я переключил свою деятельность на использование фильтра намерений. Я больше не получаю окно разрешений после первого раза, поэтому флажок работает. Вместо этого, каждый раз, когда устройство повторно подключается, он вызывает onCreate()
моего приложения, разбивая его.
У меня есть launchMode="singleInstance"
(на самом деле, я перепробовал все сорта), и в то время как приложение и работает, и сверху на экране, то onCreate()
вызывается вместо onNewIntent()
(который документация, кажется, предположить, должно бывает).
Я также читал, что мне нужно установить android:launchMode="singleInstance"
Я также прочитал мне нужно установить android:taskAffinity=""
Все безрезультатно. Я знаю, что есть много подобных сообщений, но никто из них, похоже, не работает. Любые советы приветствуются.
Вот мой AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.me.myapp" >
<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"
android:launchMode="singleInstance" >
<activity
android:name=".MainActivity"
android:taskAffinity=""
android:label="@string/app_name"
android:configChanges="keyboard" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<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>
</application>
</manifest>