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实例。如果你设置 singleTop
,onNewIntent()
被调用,你的 activity 被重新使用,如果它在堆栈的顶部。否则它会创建一个新的。
您也可以使用 singleTask
或 singleInstance
,但 Google 在大多数情况下不鼓励这样做。但有时它可能是解决问题的正确方法。
我正在开发一个应用程序,它可以在连接到平板电脑时与 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实例。如果你设置 singleTop
,onNewIntent()
被调用,你的 activity 被重新使用,如果它在堆栈的顶部。否则它会创建一个新的。
您也可以使用 singleTask
或 singleInstance
,但 Google 在大多数情况下不鼓励这样做。但有时它可能是解决问题的正确方法。