Android 意图过滤器重新启动 Activity?

Android intent filter restart Activity?

我正在开发一个应用程序,它可以在连接到平板电脑时与 USB 设备通信。 为了避免用户接受 android 访问设备,我设置了一个意图过滤器:

<intent-filter>
            <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            <action android:name="android.hardware.usb.action.USB" />
        </intent-filter>
        <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/usb_device_filter" />

我的问题是,有了这个 Intent 过滤器,每次我插入设备并启动另一个 activity 时都会调用 "onCreate" 方法,如果没有 Intent 过滤器,它只会被调用一次。 这是 "onCreate" 方法:

@Override   
protected void onCreate(Bundle savedInstanceState) {    
    try {   
        super.onCreate(savedInstanceState);         
        setContentView(R.layout.activity_msp430_hid);               //define activity layout
        setVersionToTitle();    
        btnSend = (Button) findViewById(R.id.btnSend);      //Send button
        btnSend.setOnClickListener(this);                   //Listener for Send Button
        btnSend.setEnabled(true);
        btnSelectHIDDevice = (Button) findViewById(R.id.btnSelectHIDDevice);    //Select HID Device button
        btnSelectHIDDevice.setOnClickListener(this);        //Listener for Select HID Device button
        btnClear = (Button) findViewById(R.id.btnClear);    //Clear button
        btnClear.setOnClickListener(this);                  //Listener for Clear button
        edtxtHidInput = (EditText) findViewById(R.id.edtxtHidInput);    //User editable text area for sending information to attached device        
        log_txt = (EditText) findViewById(R.id.log_txt);    //Text area for displaying information      
        mLog("Initialized\nPlease select your USB HID device");         
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);    
        mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);  //Get USB permission intent for broadcast
        IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
        filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
        filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
        registerReceiver(mUsbReceiver, filter);             //Register broadcast receiver
        edtxtHidInput.setText("Enter Text Here");   
        uiHandler.postDelayed(runnable, 100);               //Start runnable after 100ms

    } catch (Exception e) {
        Log.e("Init", "Initialization error", e);

    }   
}

广播接收器:

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
                setDevice(intent);
            }
        }
        //device attached
        if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
            synchronized (this) {
                setDevice(intent);      //Connect to the selected device
            }
            if (device == null) {
                mLog("device connected");
            }
        }
        //device detached
        if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
            if (device != null) {
                device = null;
                //btnSend.setEnabled(false);
            }
            mLog("device disconnected");
        }
    }

简单连接设备的"setDevice"方法:

private void setDevice(Intent intent) {
    device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
    if (device != null && intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
        mLog("Selected device VID:" + Integer.toHexString(device.getVendorId()) + " PID:" + Integer.toHexString(device.getProductId()));
        connection = mUsbManager.openDevice(device);        //Connect to device
        intf = device.getInterface(0);

为什么?

显然,这是默认行为。检查 android:launchMode here.

默认启动模式为standard,这意味着每次连接USB设备时,都会创建一个新的Activity实例。如果你设置 singleToponNewIntent() 被调用,你的 activity 被重新使用,如果它在堆栈的顶部。否则它会创建一个新的。

您也可以使用 singleTasksingleInstance,但 Google 在大多数情况下不鼓励这样做。但有时它可能是解决问题的正确方法。