当前位置: 首页 > 知识库问答 >
问题:

Android意图过滤器重启活动?

杜砚
2023-03-14

我正在开发一个连接到平板电脑时与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" />

我的问题是,有了这个意图过滤器,每次我插入设备并启动另一个活动时都会调用“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);

    }   
}

广播接收机:

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);

为什么?

共有1个答案

相云
2023-03-14

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

默认启动模式是< code>standard,这意味着每次连接USB设备时,都会创建一个新的活动实例。如果设置了< code>singleTop,则调用< code>onNewIntent(),并且重用您的活动(如果它位于堆栈顶部)。否则它会创建一个新的。

您也可以使用<code>singleTask

 类似资料:
  • 我的目标是让Android自动打开我的应用程序中以开头的任何链接。我已经在服务器上放置了所需的文件: 这是我的舱单的相关部分: 我的设备使用Charles代理,它允许您查看请求。我没有看到有人要求去测试。touchwonders.com。我在安装前使用了,这应该已经清除了缓存并强制重新获取JSON。

  • 因为我想用一些动画来启动我的应用程序。我需要先开始动画活动。SplashActivity是动画活动。 在manifest中,我尝试这样做: 但我有一个错误: 执行 com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction Android 资源链接失败时发生故障 错误:/Users/kal

  • 我有两个用于应用程序的根活动的意图过滤器 一个过滤器用于从启动器图标启动应用程序,另一个过滤器用于在用户触摸NFC标签时启动活动。 我希望当用户在应用程序的任何活动中按下HOME按钮时,下一次他按下启动器图标或触摸NFC标签时,应用程序必须恢复(每个应用程序都是如此)。 但这是正在发生的事情:当用户点击NFC标签时,第一个活动被启动。然后,他导航到进一步的活动。按回家。再次点击NFC标签,启动第一

  • 我已将要首先运行的活动从更改为另一个活动。我通过编辑Android清单并复制: 去我想要的活动。现在,当我运行或调试我的应用程序在我的android设备上成功安装,但它不会自动启动像之前我必须点击图标,我得到下面的错误,如果我运行它在模拟器正确的活动启动只在第一次安装后,它只是忽略该活动,并且总是启动。 请帮忙。 我的全部清单:

  • 我正在尝试在我的应用程序中使用USB附件。它很好用,但是我有一个问题。 如果我将USB_ACCESSORY_ATTACHED意向过滤器放在清单中,那么当设备插入时,应用程序会自动启动。这很好,但有时当我拔下设备并将其重新插入时,应用程序会再次启动。 好吧,我真的不希望它自动启动,所以我删除了意图过滤器。删除意图过滤器效果最好,但它每次都会请求用户权限,并忽略“默认用于此USB配件”复选框。 有没有

  • 问题内容: 我为具有不同元数据的活动设置了一些别名。 在此元数据中,我设置了片段的名称,然后通过反射将其加载。 我不知道这是否是一个“干净”的解决方案,尽管通过使用Fragments并将功能放入内部,我只具有一个SuperActivity和2个Empty SubActivity来指定清单中的每个。 现在的问题是:我可以通过意图启动别名吗?无法工作,因为我找不到通过意图调用来设置元数据的方法。 我需