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łę.
