Android意图过滤器重启活动?

Rom*_*ain 6 usb android intentfilter

我正在开发一个连接到平板电脑时与 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" />
Run Code Online (Sandbox Code Playgroud)

我的问题是,有了这个意图过滤器,每次我插入设备并启动另一个活动时,都会调用“onCreate”方法,如果没有意图过滤器,它只会被调用一次。这是“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);

    }   
}
Run Code Online (Sandbox Code Playgroud)

广播接收器:

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");
        }
    }
Run Code Online (Sandbox Code Playgroud)

简单连接到设备的“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);
Run Code Online (Sandbox Code Playgroud)

为什么 ?

Jak*_*sky 4

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

默认的 launchMode 是standard,这意味着每次连接 USB 设备时,都会创建一个新的 Activity 实例。如果你设置singleToponNewIntent()则被调用并且您的活动将被重新使用(如果它位于堆栈顶部)。否则它会创建一个新的。

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