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:
- 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)
- Schalter auf einem Bluetooth-Gerät (Dies wurde früher gepaart, so android weiß es)
- 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.
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! –
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 –