2016-03-22 17 views
1

Tablete bağlandığında usb aygıtlarıyla iletişim kuran bir uygulama geliştiriyorum. cihaza erişmek için android kabul etmek kullanıcıyı önlemek için, ben bir amaç filtresini ayarlayın:Android amaç filtresi yeniden başlatma Etkinlik?

sorum, bu amaç filtresini sahip "onCreate" yöntemi Bir aygıtı ve başka fişi her zaman çağrılan olduğunu
<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" /> 

etkinlik niyet filtresi olmadan başlatılır, sadece bir kez denir.

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

    } 
} 

yayın alıcısı:

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" yöntemi sadece cihaza bağlanır:

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

Neden Burada "onCreate" yöntemidir?

+0

Kendime cevap vermek için, Android bir USB cihazına bağlantıyı yapılandırma değişikliği olarak görüyor ve tekrar aktivite başlatıyor, değil mi? – Romain

cevap

0

Görünüşe göre, bu varsayılan davranıştır. android:launchModehere'u kontrol edin.

Varsayılan launchMode, standard'dir; bu, bir USB aygıtı her bağladığınızda yeni bir Activity örneğinin oluşturulduğu anlamına gelir. singleTop değerini ayarlarsanız, onNewIntent() çağrılır ve etkinliğiniz yığının en üstünde ise yeniden kullanılır. Aksi halde yeni bir tane oluşturur.

singleTask veya singleInstance'u da kullanabilirsiniz, ancak Google bunu çoğu durumda engeller. Ancak bazen bir problem için doğru çözüm olabilir.