Ta odpowiedź zakłada usługa jest „rozpoczął” usługa. Jeśli jest to usługa związana lub zamierzona, zaznacz to w komentarzu, a zaktualizuję opis i kod w tym miejscu.
Rozwiązaniem, które sugeruję, jest zaimplementowanie poniższej czynności do obsługi interfejsu użytkownika rozdzielczości. Wymień metody w usłudze onConnectionFailed()
z tego kodu, aby przekazać wyłączyć przetwarzanie rozdzielczości do ResolverActivity
:
@Override
public void onConnectionFailed(ConnectionResult result) {
Intent i = new Intent(this, ResolverActivity.class);
i.putExtra(ResolverActivity.CONNECT_RESULT_KEY, result);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
Dodaj aktywności pokazany poniżej do swojej aplikacji. Gdy żądanie połączenia w usłudze nie powiedzie się, wynik połączenia, który jest Parcelable
, jest przekazywany do działania. Działanie obsługuje interfejs użytkownika rozdzielczości, a po zakończeniu zwraca stan do usługi jako dodatkowy cel. Konieczne będzie zmodyfikowanie kodu w usłudze onStartCommand()
w celu sprawdzenia dodatków w celu określenia, czy jest on wywoływany, aby uruchomić usługę po raz pierwszy, lub aby uzyskać status rozdzielczości od ResolverActivity
.
Udoskonaleniem tego podejścia byłoby wysłanie powiadomienia o numerze PendingIntent
dla ResolverActivity
zamiast natychmiastowego rozpoczęcia działania. Dałoby to użytkownikowi opcję opóźnienia rozwiązania problemu z połączeniem.
public class ResolverActivity extends AppCompatActivity {
public static final String TAG = "ResolverActivity";
public static final String CONNECT_RESULT_KEY = "connectResult";
public static final String CONN_STATUS_KEY = "connectionStatus";
public static final int CONN_SUCCESS = 1;
public static final int CONN_FAILED = 2;
public static final int CONN_CANCELLED = 3;
// Request code to use when launching the resolution activity
private static final int REQUEST_RESOLVE_ERROR = 1111;
private static final String ERROR_CODE_KEY = "errorCode";
private static final String DIALOG_FRAG_TAG = "errorDialog";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate()");
// No content needed.
//setContentView(R.layout.activity_main);
Intent i = getIntent();
ConnectionResult result = i.getParcelableExtra(CONNECT_RESULT_KEY);
if (result.hasResolution()) {
try {
Log.i(TAG, "Starting error resolution...");
result.startResolutionForResult(this, REQUEST_RESOLVE_ERROR);
} catch (IntentSender.SendIntentException e) {
// There was an error with the resolution intent.
sendStatusToService(CONN_FAILED);
finish();
}
} else {
// Show dialog using GooglePlayServicesUtil.getErrorDialog()
ErrorDialogFragment.newInstance(result.getErrorCode())
.show(getSupportFragmentManager(), DIALOG_FRAG_TAG);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent result) {
if (requestCode == REQUEST_RESOLVE_ERROR) {
if (resultCode == RESULT_OK) {
Log.i(TAG, "onActivityResult(): Connection problem resolved");
sendStatusToService(CONN_SUCCESS);
} else {
sendStatusToService(CONN_CANCELLED);
Log.w(TAG, "onActivityResult(): Resolution cancelled");
}
// Nothing more to do in this activity
finish();
}
}
private void sendStatusToService(int status) {
Intent i = new Intent(this, MyGoogleApiService.class);
i.putExtra(CONN_STATUS_KEY, status);
startService(i);
}
// Fragment to display an error dialog
public static class ErrorDialogFragment extends DialogFragment {
public static ErrorDialogFragment newInstance(int errorCode) {
ErrorDialogFragment f = new ErrorDialogFragment();
// Pass the error that should be displayed
Bundle args = new Bundle();
args.putInt(ERROR_CODE_KEY, errorCode);
f.setArguments(args);
return f;
}
@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Get the error code and retrieve the appropriate dialog
int errorCode = getArguments().getInt(ERROR_CODE_KEY);
return GooglePlayServicesUtil.getErrorDialog(
errorCode, getActivity(), REQUEST_RESOLVE_ERROR);
}
@Override
public void onDismiss(DialogInterface dialog) {
Log.i(TAG, "Dialog dismissed");
}
}
}
Twój problem polega na uzyskaniu odwołania do działania? w życiu usługi są aktywności również żywe? – Elltz
Jaki rodzaj usługi: rozpoczęty, związany, intencyjny? –
rozpoczęte, gdy aktywność mogła być w jakimkolwiek stanie – user3290180