2017-06-02 1 views
0

TorePrevent eine neue Aktivität von Laich, wenn ein Bluetooth-Gerät

  • verbindet Wenn ein Bluetooth-Gerät verbunden ist, und keine Aktivität ausgeführt wird, starten Aktivität
  • Wenn ein Bluetooth-Gerät verbunden ist, und eine Aktivität ist bereits ausgeführt wird, eine Verbindung mit den bereits laufenden Aktivitäten

Problem

  • Sobald ein Gerät eine Verbindung herstellt, wird eine neue Aktivität gestartet. Ich konnte die App nicht erneut verwenden.

Was ich geschafft haben

  • zu lösen, wenn ein Bluetooth-Gerät verbunden ist, und keine Aktivität ausgeführt wird, starten Aktivität

Das Problem zeigt sich bei der Verwendung von BroadCastReceivers die wiederum startet die Aktivität mit Intents. Aus irgendeinem Grund durchläuft die Aktivität ihren Lebenszyklus und erzeugt neue Fenster, wenn ein neues Gerät eine Verbindung herstellt.

Ich habe dies nur auf einem Nexus 6P mit Android N getestet. Ich habe noch keine Ahnung, welche Auswirkungen diese Implementierung für andere Geräte noch hat. Aber ich muss zumindest arbeiten auf ein Gerät.

Manifest

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".BtActivity" /> 
    <receiver android:name=".BtConnectionBroadcastReceiver" android:priority="100000"> 
     <intent-filter> 
      <action android:name="android.bluetooth.device.action.ACL_CONNECTED" /> 
      <action android:name="android.bluetooth.device.action.ACL_DISCONNECTED" /> 
      <action android:name="android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED" /> 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 
      <action android:name="android.media.VOLUME_CHANGED_ACTION" /> 
     </intent-filter> 
    </receiver> 
</application> 

BtConnectionBroadcastReceiver

public class BtConnectionBroadcastReceiver extends BroadcastReceiver { 
    private static final String TAG = "BT"; 
    public static final String BROADCAST_ACTION_CONNECTED = "CONNECTED"; 
    public static final String BROADCAST_ACTION_DISCONNECTED = "DISCONNECTED"; 
    SharedPreferences mSharedPreferences; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 

     // When discovery finds a device 
     if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { 
      // Get the BluetoothDevice object from the Intent 
      Log.d(TAG, "DEVICE CONNECTED"); 
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      Log.d("DEVICE NAME", device.getName()); 
      Log.d("DEVICE ADDRESS", device.getAddress()); 
      Intent i = new Intent(context, BtActivity.class); 
      context.startActivity(i); 
     } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { 
      Log.d(TAG, "DEVICE DISCONNECTED"); 
      intent = new Intent(); 
      intent.setAction(BtConnectionBroadcastReceiver.BROADCAST_ACTION_DISCONNECTED); 
      context.sendBroadcast(intent); 
     } 
    } 

BtActivity

public class BtActivity extends AppCompatActivity { 
private static final String TAG = "BT"; 
Window mWindow; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_bt); 

    Log.d(TAG, "onCreate"); 
    IntentFilter filter = new IntentFilter(BtConnectionBroadcastReceiver.INTENT_FILTER); 
    filter.addAction(BtConnectionBroadcastReceiver.BROADCAST_ACTION_CONNECTED); 
    filter.addAction(BtConnectionBroadcastReceiver.BROADCAST_ACTION_DISCONNECTED); 
    //registerReceiver(mReceiver, filter); 

    mWindow = getWindow(); 
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(); 
    //params.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_OFF; 
    params.screenBrightness = 0.2f; 
    mWindow.setAttributes(params); 
    mWindow.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
    mWindow.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
    mWindow.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
    mWindow.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    mWindow.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 
    mWindow.getDecorView().setSystemUiVisibility(
      View.SYSTEM_UI_FLAG_LAYOUT_STABLE | 
        View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | 
        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | 
        View.SYSTEM_UI_FLAG_FULLSCREEN | 
        View.SYSTEM_UI_FLAG_IMMERSIVE); 
    } 

@Override 
protected void onResume() { 
    super.onResume(); 
    Log.d(TAG, "onResume"); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    Log.d(TAG, "onDestroy"); 
} 
} 

Wenn Ich diesen Code ausführen, bekomme ich die folgende Kette:

  1. starten MainActivity (nicht im Lieferumfang enthalten, es enthält nur eine Aktivität mit dem Standard-Haupt-Layout, so dass der Empfänger-Anwendungen registriert ist)
  2. Schalter auf einem Bluetooth-Gerät (Dies wurde früher gepaart, so android weiß es)
  3. Warten sie, bis sie verbindet und nutzen sie diesen:
    • angeschlossene Gerät
    • onCreate
    • onResume

kann ich nicht verstehen, warum die Aktivität an diesem Punkt neu gestartet wird. Die Aktivität wird bereits ausgeführt, der BroadcastReceiver sendet nur eine Übertragung an eine bereits ausgeführte Aktivität.Ich kann nicht herausfinden, warum es einen Grund für die Aktivität gibt, sich selbst zu töten und dann wieder neu starten.

+1

Wenn Sie die Aktivität starten, versuchen Sie Intent.setFlags (Intent.FLAG_ACTIVITY_SINGLE_TOP) zu Ihrer Absicht hinzuzufügen. Wie in der Dokumentation angegeben: Wenn diese Option aktiviert ist, wird die Aktivität nicht gestartet, wenn sie bereits am Anfang des Verlaufsstapels ausgeführt wird. Hoffe das ist was du suchst! –

+0

Diese Frage musste aufgeteilt werden, um auf den Punkt zu kommen. Ich habe eine weitere Frage in Bezug auf Bluetooth Verbindung Staaten mit BroadcastReceivers hier hinzugefügt: https://stackoverflow.com/questions/44367910/prevent-ondestroy-when-bluetooth-connection-state-changes –

Antwort

0

Versuchen Sie es, indem Sie den Startmodus auf die Aktivität einstellen, die gerade gestartet wird.

android:launchMode="singleTop" 

Dies liefert die Absicht auf die gleiche Aktivitätsinstanz, wenn diese Tätigkeit zur Zeit ist die oberste Aktivität in dieser Aufgabe und onNewIntent() -Methode der Aktivität wird statt onCreate aufgerufen werden(). Und verwalten Sie die Funktionalität, indem Sie wichtige Extras weitergeben. Wenn diese Aktivität nicht die höchste Aktivität in ihrer Aufgabe ist oder wenn überhaupt keine Aktivität ausgeführt wird, wird eine neue Instanz der Aktivität erstellt und onCreate() gefolgt von onResume() wird aufgerufen.

Andere Startmodi wie "singleTask"/"singleInstance" können ebenfalls je nach Bedarf verwendet werden.

Hoffe, das hilft.

+0

Dies half mit nicht neue Aktivitäten hervorbringen, jedoch, es hilft nicht dabei zu verhindern, dass onDestroy aufgerufen wird, wenn sich der Bluetooth-Verbindungsstatus ändert. Ich akzeptiere die Antwort und poste eine weitere, weil ich erkannt habe, dass diese Frage aus zwei besteht. Ich werde diese Frage auch bearbeiten, also ist es am Punkt. –

Verwandte Themen