2017-02-26 5 views
1

私はこのマニフェスト構成でUSBホストモードを使用することができることを知っている:USBホスト:フォアグラウンドにない場合にのみアプリケーションを開く方法は?

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

そして、これが私の活動のUSBデバイスを接続するたびに起動します。問題は、すでにフォアグラウンドで実行されている場合に再オープンしたくないということです。私のアプリの他のアクティビティがすでにフォアグラウンドで実行されている場合は、起動させたくありません。どうやってするか?

答えて

0

私はついに道を見つけました。このようにイベントを処理する

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

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は私のカスタム Applicationクラスの静的フィールドである

public class CustomApplication extends Application { 

    public static boolean resumed = false; 

} 
私は私のマニフェスト新しい受信機に追加しました

このフィールドの値は、すべてのアクティビティの親クラスに設定します。

public abstract class AbstractActivity extends Activity { 

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

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

} 

このようにして、自分の活動がどれも前景にない場合にのみ、私は実際にMyActivityを起動します。

関連する問題