У меня есть кнопка, которая должна завершать sh всего приложения при нажатии. Нажатие кнопки открывает диалог, и после того, как пароль вставлен, положительный слушатель диалога должен закрыть приложение. Это положительный код прослушивателя диалога:
.setPositiveButton("Done", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
boolean res = ApplicationDataManager.checkEntryDetails(userName.getText(), password.getText());
if(res){
logger.writeLog(LogType.INFO, TAG, "createDialog. Session ended.");
//message for ending session.
Toast.makeText(MenuActivity.this, "Session successfully ended!",
Toast.LENGTH_SHORT).show();
// stop both sensors and video recording.
stopService(sensorIntent);
stopService(videoRecordIntent);
menuActivityReference.finishAffinity();
System.exit(0);
}else{
logger.writeLog(LogType.INFO, TAG, "createDialog. wrong username or password for End Session");
//message for wrong input
Toast.makeText(MenuActivity.this, "Wrong user name or password! Please try again.",
Toast.LENGTH_SHORT).show();
//show dialog again for retry.
showDialog();
}
У меня есть несвязанная служба, которая останавливается stopService(sensorIntent);
и запускается так:
// create and start the sensors and video recording services in the background.
sensorIntent = new Intent(this, SensorsService.class);
sensorIntent.putExtra(PATIENT_KEYWORD, patient);
sensorIntent.putExtra(SENSORS_FILE_PATH, sensorFile);
startService(sensorIntent);
, но, к сожалению, Сервисная функция onDestroy () не вызывается.
public void onDestroy() {
logger.writeLog(LogType.INFO, TAG, "onDestroy. Unregistering sensors");
// unregister all of the sensors from sensorManager listener.
for (Sensor s : sensorList) {
sensorManager.unregisterListener(this, s);
}
super.onDestroy();
}
Для ясности я хочу закрыть приложение, когда нажата положительная кнопка (и пароль верен).
У меня есть регистратор, который пишет в файл, когда метод вызывается, поэтому я знаю, что он не вызывается. Также пытался отлаживать и не попал туда. После звонка на stopService(sensorIntent);
я закрываю приложение следующими строками:
menuActivityReference.finishAffinity();
System.exit(0);
, а menuActivityReference
- это просто ссылка на действие. (Это делается из прослушивателя кнопок, поэтому я не могу использовать ключевое слово this
).
После широкого поиска я увидел, что onDestroy()
не всегда вызывается (по крайней мере, не сразу) поэтому мои вопросы:
- Что-то не так с этим поведением? Должен ли я завершить sh мое приложение по-другому?
- Есть ли обратный вызов, который вызывается в android после
System.exit()
? - Если нет, то является ли хорошей практикой реализация функции, которая будет выполнять то же действие, что и мой
onDestroy()
, и вызывать ее до stopService()
?