2016-09-20 5 views
3

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!

Antwort

2

Teil des Problems ist, dass Sie onBind(), zwingende, die die TileService Implementierung von onBind() clobbers, Android verhindert mit ConnectionQuickSettingsService von der Arbeit. Ich würde erwarten, dass es in LogCat Fehlermeldungen von einem Systemprozess gibt, der sich darüber beschwert.

Der andere Teil Ihres Problems ist, dass Sie davon ausgehen, dass getQsTile() zu beliebigen Zeitpunkten funktioniert. It doesn't.

Ich empfehle ein anderes Interaktionsmuster mit Fliesen finden, wie die Verwendung von META_DATA_ACTIVE_TILE und requestListeningState() und Ihre Binder und onBind() Methode loszuwerden.

+0

Wenn ich meine 'Binder' und' onBind() 'lösche, wie bekommt meine' MainActivity' einen Verweis auf 'TileService', so dass ich 'toggleTileUI()' aufrufen kann? – jcarnide

+0

@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

+2

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

0

Ich glaube nicht, dass Sie alle Service-Verbindung benötigen. Ich würde die Metadaten META_DATA_ACTIVE_TILE der Kachel Service-Manifest-Deklaration hinzufügen, und dann können Sie TileService.requestListeningState(context, new ComponentName(context, TileService.class)); aufrufen, die onStartListening() auslösen wird. Danach konnte onStartListening() eine Methode aufrufen, um den Kachelstatus/das Label/Symbol zu aktualisieren.

Auch in Ihrer Tile-Service-Methode, um die Kachel zu aktualisieren, würde ich eine Überprüfung hinzufügen, wenn (getQsTile!= null)

Verwandte Themen