Я ищу наиболее эффективный способ выполнения простой задачи. Как новый разработчик Android, я не слишком уверен, какая из этих стратегий будет лучше для моего приложения с точки зрения эффективности памяти. Я предполагаю, что некоторые из этих подходов могут вызвать проблемы с потоками, о которых я не знаю.Сон VS alarmManager.set VS alarmManager.setRepeat VS Handler
Все три решения в настоящее время ведут себя по желанию.
Это действительно простое приложение. Идея заключается в том, что моя MainActivity запускает IntentService, которая будет работать в фоновом режиме после открытия приложения. Вся необходимая мне функциональность заключается в том, что уведомление создается произвольными интервалами в течение дня (примерно на один час) на неопределенный срок, пока пользователь не остановится. Уведомление производится в виде простого метода void, отображая уведомление как текст и вибрируя телефон один раз.
Мой MainActivity начинает IntentService:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, NotificationService.class);
startService(intent);
}
}
Мой IntentService очень просто. Он называется NotificationService, расширяет IntentService и только переопределяет метод onHandleIntent. Конструктор пуст, кроме супер («Сервис»). Вопрос заключается в том, как заставить уведомления всплывать в течение всего дня в фоновом режиме наиболее эффективным способом. Это в моей реализации выполняется в методе onHandleIntent для всех трех методов.
Метод один:
@Override
protected void onHandleIntent(Intent intent) {
makeNotification();
AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
PendingIntent pintent = PendingIntent.getService(
getApplicationContext(), 0, intent, 0);
alarm.cancel(pintent);
alarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()
+ 60000 * 60, pintent);
}
Обратите внимание, что с этим, пользователь должен удалить приложение, чтобы получить уведомления, чтобы остановить, что не желательно (хотя я думаю, что я мог бы просто добавить кнопку или что-то что бы отменить намерение)
Метод Два:
protected void onHandleIntent(Intent intent) {
makeNotification();
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
PendingIntent pintent = PendingIntent.getService(
getApplicationContext(), 0, intent, 0);
alarm.cancel(pintent);
alarm.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()
+ 60*1000, 60000*60 ,pintent);
}
Способ три:
@Override
protected void onHandleIntent(Intent intent) {
makeNotification();
try {
sleep(60000 * 60);
startService(intent);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Может ли кто-нибудь помочь мне решить плюсы и минусы этих трех методов? Я не уверен, что понимаю, какой из них был бы идеальным, хотя все они дают мне правильную функциональность. В качестве побочного примечания, в моем исследовании я заметил класс «Handler», который также может быть полезен здесь.
Благодарим за разъяснение моей плохой формулировки использования IntentService, а также за дополнительную информацию о правильном использовании setRepeating/set. Это очень полезно! – Jaked222