2016-10-22 5 views
1

Я ищу наиболее эффективный способ выполнения простой задачи. Как новый разработчик 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», который также может быть полезен здесь.

ответ

1

Все функциональные возможности, которые мне нужны прямо сейчас, предназначены для того, чтобы уведомление создавалось случайными интервалами в течение дня (примерно на один час) на неопределенный срок, пока пользователь не остановился.

AlarmManager, и потенциально JobScheduler, являются единственными жизнеспособными вариантами.

Идея заключается в том, что мой MainActivity начинает IntentService, который будет работать в фоновом режиме после того, как приложение открыто

Не совсем. IntentService будет работать только до тех пор, пока он не завершит выполнение onHandleIntent() (включая выполнение его N раз, если команды N будут отправлены ему быстро). IntentService может работать некоторое время, но он предназначен для обработки какой-либо транзакции бизнес-логики. Это не, предназначенный для работы на неопределенный срок, и так будет плохо для пользователя.

Может кто-нибудь, пожалуйста, помогите мне решить плюсы и минусы этих трех методов?

Вариант третий непригоден. Во-первых, он не будет надежным, так как он перестанет работать после завершения процесса. Во-вторых, он связывает кучу системной ОЗУ без уважительной причины, ОЗУ, которую пользователь может использовать для более эффективного использования. Only have a service running when it is actively delivering value to the user. Наблюдение за тиканием часов не доставляет потребителю значительную ценность.

Я заметил, класс «Handler», который также может быть полезным здесь

Нет, так как она будет страдать от тех же проблем, как вариант три.

Что касается ваших двух AlarmManager вариантов, это сводится к тому, хотите ли вы регулярно встречающиеся ошибки (setRepeating()) или нерегулярно встречающихся аварийных сигналов (set()).

Если вы перейдете на страницу setRepeating(), переведите код AlarmManager из службы и в действие. Нет точки — и определенными расходами — на номер setRepeating() на каждую тревогу. В конце концов, точка за setRepeating() состоит в том, что знает, что нужно повторить, так что вам не нужно рассказывать об этом в каждом случае «О, эй, я знаю, что я сказал вам последние 1337 раз, которые вы должны повторить, но, , не забудьте повторить, м'кай? ».

С опцией set(), так как вы специально не просят тревог повторить, вы бы продолжать планировать их на службу (или, возможно, когда-то от деятельности, а затем остальные от службы), более или меньше, как у вас есть.

+0

Благодарим за разъяснение моей плохой формулировки использования IntentService, а также за дополнительную информацию о правильном использовании setRepeating/set. Это очень полезно! – Jaked222

Смежные вопросы