Mam uruchomioną usługę w tle w mojej aplikacji na Androida. Używam IdentToken, który otrzymuję od działania logowania, aby uwierzytelnić się na serwerze zaplecza. Usługa działa w trybie START_STICKY
, więc nawet gdy aplikacja jest zamknięta, usługa działa nadal w tle, aby otrzymywać wszelkie powiadomienia z serwera zaplecza. Problem, z którym borykam się, to koniec ważności identyfikatora, nie mogę go odnowić w samej usłudze. Funkcja zwrotna nie otrzyma żadnego wyniku, jeśli token wygasł. Jeśli token jeszcze nie wygasł, natychmiast otrzymuje wynik.Cichy Google Zaloguj się w tle usługi Android
Oto kod funkcji signIn i funkcji handleSignIn.
private void signIn() {
new Thread(new Runnable() { public void run() {
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestIdToken("<My server_client_id>")
.build();
GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(context)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn
(mGoogleApiClient);
if (opr.isDone()) {
// If the user's cached credentials are valid, the OptionalPendingResult will be "done"
// and the GoogleSignInResult will be available instantly.
Log.d(TAG, "Got cached sign-in");
GoogleSignInResult result = opr.get();
handleSignInResult(result);
} else {
// If the user has not previously signed in on this device or the sign-in has
// expired,
// this asynchronous branch will attempt to sign in the user silently. Cross-device
// single sign-on will occur in this branch.
Log.d(TAG, "had to sign in again");
opr.setResultCallback(new ResultCallback<GoogleSignInResult>() {
@Override
public void onResult(GoogleSignInResult googleSignInResult) {
Log.d(TAG, "got result");
handleSignInResult(googleSignInResult);
}
});
}}}).start();
}