svd71
@svd71

Какая последовательность завершения работы приложения в Android?

Создал приложение с broadcast-сервисом, который активируется с помощью AlarmManager на короткий момент, выполняет некоторую работу и затем сервис "умирает" до следующего цикла. У приложения в основном активити есть глюк, который не мешает работе приложения, но при подключения логера виден. И хотелось бы его исправить.

В приложении используются три основных объекта в цепочке:
  1. Активити
  2. Сервис
  3. Ресивер

Так вот при создании активити регистрируется ресивер. Это не очень хорошо, так как хотел бы регистрировать ресивер при создании сервиса, прямо из сервиса. Но при этом выбрасывает исключение NullPointerException при вызове Service.registerReceiver(). При поиске по сети нашел решение - перенести его из функции Service.onCreate() в более благополучный код с известным контекстом. Перенес в активити и дело пошло.

Опять же при закрытии активити системной клавишей возврата так же выбрасывает NullPointerException, если сервис активен и продолжает работать.
Но как я понимаю, сервис является основной и должен оставаться в системе до тех пор, покане придет команда остановки. Да и все управление должно так же осуществляться из сервиса.
И так вопросы:
1. в какой последовательности создавать и регистрировать объекты, в каких методах;
2. в какой последовательности разрушать эти все объекты, в каких методах;
  • Вопрос задан
  • 344 просмотра
Пригласить эксперта
Ответы на вопрос 1
Не совсем понял кто у Вас порождает и кто принимает броадкасты. AlarmManager, Service, Activity?

AlarmManager при наступлении определенного времени выполняет переданный ему PendingIntent, который, как я понял, запускает сервис. Сервис что-то делает, посылает броадкаст и завершается. На этот броадкаст подписан ресивер, определенный внутри активити, и стало быть если активити запущена она должна что-то показать.

Если порядок работы такой, то всё что нужно сделать, это описать соответствующий PendingIntent и передать его AlarmManager-у. например так:

public class ScheduleAlarmActivity extends AppCompatActivity {
	
	@Override
	public void onCreate(Bundle savedState) {
		super.onCreate(savedState);
		setAlarm(System.currentTimeMills() + 1000);
	}

	public void setAlarm(long time) {
    	        Intent intent=new Intent(this, BroadcastService.class);
    	        intent.putExtra("INTENT_DATA", "some intent data");
    	
            	PendingIntent pi= PendingIntent.getService(context,0, intent,0);

    	        AlarmManager am=(AlarmManager) getSystemService(Context.ALARM_SERVICE);
            	am.set(AlarmManager.RTC_WAKEUP, time, pi);
	}
}


Далее в сервисе в методе onStartCommand(...) обрабатываем полученный интент, делаем то, что нужно, шлем бродкаст и завершаем свою работу вызовом метода stopSelf();

public class BroadcastService extends Service {
	// ....
	public int onStartCommand(Intent intent, int flags, int startId) {
	        String intnetData = intent.getString("INTENT_DATA", "");
		    
		//  делаем свою работу

	        Intent broadcast = new Intent("SOME_ACTIVITY_ACTION");
	        LocalBroadcastManager.getInstance(this).sendBroadcast(broadcast);

	        stopSelf();

		return START_NOT_STICKY;
        }
}


Теперь про активити. При создании активити регистрируем ресивер в onResume() и подписываем его на необходимый броадкаст от сервиса. В onPause отпирываем ресивер.

public class ActionActivity extends AppCompatActivity {

	// ....

	BroadcastReceiver br = new BroadcastReceiver() {
	        @Override
            	public void onReceive(Context context, Intent intent) {
			// обрабатываем броадкаст
		}
	}

	@Override
	protected void onResume() {
		super.onResume();
		// создаем фильтр для BroadcastReceiver
	        IntentFilter intFilt = new IntentFilter("SOME_ACTIVITY_ACTION");
    	        // регистрируем (включаем) BroadcastReceiver
	        LocalBroadcastManager.getInstance(this).registerReceiver(br, intFilt);
	}

	@Override
	protected void onPause() {
		super.onPause();
		LocalBroadcastManager.getInstance(this).unregisterReceiver(br);
	}
}


В любом случае надо больше информации от Вас. Что вы хотите получить и фрагменты проблемного кода.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы