2017-02-26 4 views
1

Je sais que je peux utiliser le mode hôte USB avec cette configuration manifeste:Hôte USB: comment ouvrir mon application uniquement si elle n'est pas déjà au premier plan?

<activity 
    android:name="com.mypackage.MyActivity" 
    android:label="@string/app_name"> 

    <intent-filter> 
     <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> 
    </intent-filter> 

    <meta-data 
     android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
     android:resource="@xml/device_filter" /> 

</activity> 

Et ce lancerai mon activité à chaque fois qu'un périphérique USB est connecté. Le problème est que je ne veux pas qu'il rouvre s'il est déjà en cours d'exécution au premier plan. Je ne veux pas non plus que cela démarre si d'autres activités de mon application sont déjà exécutées au premier plan. Comment faire ça?

Répondre

0

J'ai finalement trouvé le chemin à parcourir. J'ai ajouté dans mon manifeste un nouveau récepteur:

<receiver android:name=".content.UsbReceiver"> 

    <intent-filter> 
     <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> 
    </intent-filter> 

    <meta-data 
     android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
     android:resource="@xml/device_filter" /> 

</receiver> 

qui gère l'événement ainsi:

public class UsbReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (!CustomApplication.resumed) { 
      Context applicationContext = context.getApplicationContext(); 
      Intent startIntent = new Intent(applicationContext, MyActivity.class); 
      startIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      applicationContext.startActivity(startIntent); 
     } 
    } 

} 

resumed est un champ statique dans ma classe personnalisée Application:

public class CustomApplication extends Application { 

    public static boolean resumed = false; 

} 

Je définis la valeur de ce champ dans la classe parent de toutes mes activités:

public abstract class AbstractActivity extends Activity { 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     CustomApplication.resumed = true; 
    } 

    @Override 
    protected void onPause() { 
     CustomApplication.resumed = false; 
     super.onPause(); 
    } 

} 

De cette façon, je lance réellement MyActivity seulement si aucune de mes activités n'est déjà au premier plan.