USB-хост: как открыть мое приложение, только если оно еще не на переднем плане?
Я знаю, что могу использовать режим USB-хоста с этой конфигурацией манифеста:
<activity
android:name="com.mypackage.MyActivity"
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-устройство. Проблема в том, что я не хочу, чтобы он снова открылся, если он уже запущен на переднем плане. Я также не хочу, чтобы он запускался, если какие-либо другие действия моего приложения уже выполняются на переднем плане. Как это сделать?
1 ответ
Я наконец нашел способ пойти. Я добавил в свой манифест новый получатель:
<receiver android:name=".content.UsbReceiver">
<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" />
</receiver>
который обрабатывает событие следующим образом:
public class UsbReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (!CustomApplication.resumed) {
Context applicationContext = context.getApplicationContext();
Intent startIntent = new Intent(applicationContext, MyActivity.class);
startIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
applicationContext.startActivity(startIntent);
}
}
}
где resumed
это статическое поле в моем обычае Application
учебный класс:
public class CustomApplication extends Application {
public static boolean resumed = false;
}
Я устанавливаю значение этого поля в родительском классе для всех моих действий:
public abstract class AbstractActivity extends Activity {
@Override
protected void onResume() {
super.onResume();
CustomApplication.resumed = true;
}
@Override
protected void onPause() {
CustomApplication.resumed = false;
super.onPause();
}
}
Таким образом, я фактически запускаю MyActivity только в том случае, если ни одно из моих действий уже не находится на переднем плане.