Od Androida 7.0 (API 24) zostało wprowadzona funkcja która umożliwia dodawanie własnych skrótów akcji w Twojej aplikacji. Własne kafelki w szybkich ustawieniach Androida bardzo są przydatne z punktu widzenia użytkownika ponieważ umożliwiają wykonanie konkretnej akcji. Na przykład: synchronizacji danych, uruchomienie jakiegoś urządzenia zdalnie – bez wchodzenia do aplikacji. Jednak musimy pamięta aby nie nadużywać tej funkcjonalności. W tym wpisie pokaże Ci w jaki sposób stworzyć taki kafelek i jak jego obsłużyć.
1. Plik Manifest.xml
Jak w przypadku każdego serwisu musimy też zdefiniować go w pliku manifestu:
<service android:name="Tiles.Tile" android:label="@string/label_tile" android:icon="@android:drawable/star_off" android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"> <intent-filter> <action android:name="android.service.quicksettings.action.QS_TILE" /> </intent-filter> </service>
2. Cykl życia kafelków
Cykl życia usługi TileService jest kontrolowany głównie przez system Android. Istnieją trzy fazy cyklu życia:
- dodawanie ( onTileAdded() ) – metoda ta jest wywoływana gdy kafelek jest dodawany do szybkich ustawień,
- nasłuchiwanie – jeżeli wysuwasz belkę z szybkimi ustawieniami wykonywana jest metoda onStartListening(), zaś gdy chowasz belkę wywoływana jest metoda onStopListening(),
- usuwanie ( onTileRemoved() ) – metoda ta jest wywoływana gdy kafelek jest usuwany z szybkich ustawień.
3. Kod usługi
Przykładowy kod usługi może wyglądać następująco:
package Tiles; import android.graphics.drawable.Icon; import android.os.Build; import android.service.quicksettings.TileService; import android.support.annotation.RequiresApi; import android.util.Log; @RequiresApi(api = Build.VERSION_CODES.N) public class Tile extends TileService { private String TAG = "Tile"; @Override public void onTileAdded() { Log.i(TAG, "Method: onTileAdded"); super.onTileAdded(); } @Override public void onTileRemoved() { Log.i(TAG, "Method: onTileRemoved"); super.onTileRemoved(); } @Override public void onStartListening() { Log.i(TAG, "Method: onStartListening"); super.onStartListening(); } @Override public void onStopListening() { Log.i(TAG, "Method: onStopListening()"); super.onStopListening(); } @Override public void onCreate() { Log.i(TAG, "Method: onCreate"); super.onCreate(); } @Override public void onClick() { Log.i(TAG, "Method: onClick"); super.onClick(); updateTile(); } private void updateTile() { if (android.service.quicksettings.Tile.STATE_ACTIVE == getQsTile().getState()) { Log.d(TAG,"State: INACTIVE"); changeTileState(android.service.quicksettings.Tile.STATE_INACTIVE); } else if (android.service.quicksettings.Tile.STATE_INACTIVE == getQsTile().getState()) { Log.d(TAG,"State: ACTIVE"); changeTileState(android.service.quicksettings.Tile.STATE_ACTIVE); } } private void changeTileState(int newState) { getQsTile().setIcon(Icon.createWithResource(this, newState == android.service.quicksettings.Tile.STATE_INACTIVE ? android.R.drawable.star_off : android.R.drawable.star_on)); getQsTile().setState(newState); getQsTile().updateTile(); } }
Powyższy przykład pokazuje zachowanie ikonki (gwiazdka). Jeśli stan jest aktywny to ikonka jest cała biała, natomiast jeśli stan jest nieaktywny ikonka jest szara. Przykład ten można rozbudować o własne potrzeby w metodzie updateTile(). Warto też wspomnieć o tym, że jeżeli chcemy wyświetlić jakąś informację na ekranie np.: AlertDialog to musimy sprawdzić czy urządzenie jest odblokowane w przeciwnym wypadku alert pokaże się pod ekranem blokady i użytkownik nie zobaczy komunikatu.
if (!isLocked()) { updateTile(); } else { unlockAndRun(new Runnable() { @Override public void run() { updateTile(); } }); }
4. Podsumowanie
Własne skróty akcji w szybkich ustawieniach dają Ci zupełnie nową powierzchnię do interakcji z użytkownikami i pozwalają najbardziej wymagającym użytkownikom na szybki dostęp do kluczowych i częstych operacji w Twojej aplikacji. Zachęcam do korzystania z możliwości dodawania własnych kafelków. Pamiętaj aby to robić z umiarem, a nie na siłę.