Ich versuche, eine benutzerdefinierte Schnelleinstellungen-Kachel für meine Anwendung hinzuzufügen. Ich bin dem Beispielcode/der Dokumentation von Google gefolgt, aber ich stoße auf einige Probleme. Nach längerer Suche konnte ich keine Lösungen finden.Benutzerdefinierte Schnelleinstellungen Kachel bleibt im Status "Nicht verfügbar", wenn sie an Aktivität gebunden ist
Wenn ich meine App starte, ist die Kachel im Schnelleinstellungsbereich sichtbar, aber sie bleibt in einem nicht verfügbaren Zustand.
Ich brauche eine Zwei-Wege-Kommunikation mit der Kachel, d. H. Wenn der Benutzer die Kachel auswählt, reagiert die App und wenn der Benutzer eine bestimmte Aktion in der App ausführt, wird die Kachel UI umgeschaltet.
Das Problem scheint von dem Versuch zu kommen, meine benutzerdefinierte TileService
Klasse an meine MainActivity
zu binden - immer wenn ich bin es ist, wenn die Kachel in einen ständig nicht verfügbaren Zustand geht. Ich kann nicht herausfinden warum, obwohl es erfolgreich gebunden ist. Wenn ich es nicht binde (d. H. Nur die Einwegkommunikation der Kachel, die die App befehligt), ist die Kachel aktiv und die App reagiert darauf, sie auszuwählen.
Letztendlich mache ich die Bindung, um einen Verweis auf meine benutzerdefinierte TileService
Klasse zu erhalten, um in der Lage zu sein, es Methode toggleTileUI()
zu nennen. Ich möchte keine Singleton- oder statische Elementvariable als Lösung verwenden, um einen Verweis auf meinen Dienst zu erhalten.
Hier ist, was ich in meinem AndroidManifest.xml
haben:
<service
android:name=".ConnectionQuickSettingsService"
android:label="@string/quick_setting_tile_connect"
android:icon="@drawable/tile_icon"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>
Hier ist mein ConnectionQuickSettingsService.java
:
@TargetApi(24)
public class ConnectionQuickSettingsService extends TileService {
private static final String TAG = "ConnectionQuickSettingsService";
private final IBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder {
ConnectionQuickSettingsService getService() {
return ConnectionQuickSettingsService.this;
}
}
@Override
public IBinder onBind(Intent i) {
return mBinder;
}
@Override
public void onTileAdded() {
L.d(TAG, "onTileAdded()");
}
@Override
public void onStartListening() {
L.d(TAG, "onStartListening()");
}
@Override
public void onClick() {
L.d(TAG, "Quick Settings tile selected");
toggleInAppSwitch();
toggleTileUI();
}
private void toggleInAppSwitch() {
doStuff();
}
public void toggleTileUI() {
Tile tile = this.getQsTile();
doStuffWithTile();
}
}
und schließlich (die relevanten Teile) mein MainActivity.java
:
@Override
protected void onStart() {
super.onStart();
Intent i = new Intent(this, ConnectionQuickSettingsService.class);
bindService(i, mConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
if (mBound) {
unbindService(mConnection);
mBound = false;
}
}
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
ConnectionQuickSettingsService.LocalBinder binder = (ConnectionQuickSettingsService.LocalBinder) service;
mQSService = binder.getService();
mBound = true;
L.d(TAG, "Bound to QS service successfully");
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
L.d(TAG, "Disconnected from QS service");
}
};
public void onOnOff(){
L.d(TAG, "On/Off switch toggled");
if (mBound) {
mQSService.toggleTileUI();
}
}
Jede Eingabe wäre sehr dankbar, danke!
Wenn ich meine 'Binder' und' onBind() 'lösche, wie bekommt meine' MainActivity' einen Verweis auf 'TileService', so dass ich 'toggleTileUI()' aufrufen kann? – jcarnide
@jcarnide: Sie werden all das los. 'toggleTileUI()' funktioniert nicht, weil Sie 'getQsTile() 'nicht aufrufen können, wann immer Ihnen danach ist. Ich empfehle, ein anderes Interaktionsmuster mit Ihrer Kachel zu finden, z. B. mit 'META_DATA_ACTIVE_TILE' und' requestListeningState() '. – CommonsWare
Vielleicht verstehe ich nicht richtig. Ich bekomme, dass die Kachel nicht immer verfügbar ist über 'getQsTile()' und dass mit 'META_DATA_ACTIVE_TILE' und' requestListeningState() 'kann es für die Verwendung aktivieren, aber das löst nicht das Problem, wie meine' MainActivity' geht mit der Kachel kommunizieren. Das Kachel-UI muss mit der In-App-Benutzeroberfläche synchronisiert sein (es dient zum Ein- und Ausschalten einer Funktion), dh wenn der Schalter in der App aktiviert ist, muss die Kachel aktiviert sein und über die entsprechende Beschriftung verfügen etc ... – jcarnide