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 только в том случае, если ни одно из моих действий уже не находится на переднем плане.

Другие вопросы по тегам