Привет, у меня есть код напоминания в сервисе onstart(). Когда пользователь вставляет дату и время записи в службу времени, вызываемую функцией startservice(), но только служба запускается, когда я вставляю запись, т.е. я получаю напоминание, когда он получает звонок от моей деятельности. Но я хочу напоминание после 3 дней или что-то в этом роде, так как я должен постоянно поддерживать сервис, чтобы я мог получить напоминание в будущем? или как я должен подключиться к сервису, чтобы он продолжал жить? Должен ли я вызвать функцию bindservice() из моей какой-либо деятельности или что? заранее заранее ---Как сохранить службу приложений всегда в android2.1?
ответ
Во-первых, нет необходимости в обслуживании, вы можете использовать AlarManagerClass Link класс Alarmanger для событий расписания и показывать предупреждения в определенное время и дату. Если вы хотите показывать сообщения после некоторой продолжительной продолжительности, тогда планируйте Ожидание намерения через AlarmManager, который запускает сервис в соответствующий момент времени, чтобы выполнить его работу. Когда закончите, снова запустите службу, как описано выше. Кроме того, вы можете хранить свои данные в общих настройках навсегда. Вы можете получить его в любое время для его возобновления при перезагрузке устройства или для других целей.
Не позволяйте вашей службе работать все время. Он потребляет аккумулятор и память, если это не обязательно. Скорее назначьте PendingIntent
через AlarmManager, который начинает сервис в соответствующий момент времени, чтобы выполнить его работу. Когда закончите, снова запустите службу.
В целом, службы андроидов используются на разных компьютерах, а не на сервисах/демонах. У них есть задача, которую они выполняют, затем они завершают (обычно через Service.stopSelf()
), пока кто-то не запустит их снова, чтобы сделать больше работы.
Вот небольшой пример того, как используется AlarmManager:
// get a calendar with the current time
Calendar cal = Calendar.getInstance();
// add 15 minutes to the calendar object
cal.add(Calendar.MINUTE, 15);
Intent intent = new Intent(ctx, YourService.class);
PendingIntent pi = PendingIntent.getService(this, 123, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pi);
Это запускает намерение начать YourService
в 15 минут с этого момента. Существует много документации для отправки намерений таким образом, поиск немного вокруг.
¹ Который в конечном итоге сорвет ваших пользователей: «Почему это приложение растрачивает мою батарею?» является довольно распространенным вопросом
Иногда приложение для Android может потребоваться для выполнения задачи в будущем. Чтобы сделать это, вы должны запланировать действие (также может быть услугой), которое будет запускаться с помощью Android AlarmManager. Это сообщение будет показано:
* How to set up a receiver for the scheduled event
* How to create an activity from this receiver
* Using the AlarmManager and the created classes to successfully receive and process a scheduled event
Создание BroadcastReceiver
Первое, что вам нужно, это приемник для приема события. Существует несколько ключевых аспектов, необходимых для правильной работы приемника. Сначала создайте класс, который расширяет BroadcastReceiver и переопределяет и реализует необходимый метод onReceive (контекстный контекст, намерение). Ниже приведен простой пример использования сообщения Toast:
package com.justcallmebrian.alarmexample;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
import android.os.Bundle;
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
try {
Bundle bundle = intent.getExtras();
String message = bundle.getString("alarm_message");
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(context, "There was an error somewhere, but we still received an alarm", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
}
В предыдущем примере, мы просто просто распечатав сообщение, поставляемое строкой, переданной в под именем alarm_message. Для тех, кто не знаком с Toast, это в основном короткое и быстрое сообщение, данное пользователю. Здесь вы можете найти более подробную информацию о Toast.
Помимо собственно создания класса для получения события, вы также должны объявить его в AndroidManifest.xml. Ниже следует строка, которая должна быть добавлена до закрытия тега приложения (до).
В основном это говорится, что класс AlarmReceiver доступен и начать частный процесс. Как только это будет сделано, ваш BroadcastReceiver будет готов к работе.
Настройка события с помощью AlarmManager Для того, чтобы получить событие, вам необходимо запланировать событие. Существует три способа планирования события (одноразовое событие с использованием метода set, повторяющееся событие с использованием метода setRepeating и, наконец, использование setInexactRepeating). Этот учебник будет охватывать одноразовую тревогу с использованием метода set. Для получения дополнительной информации о других событиях вы можете просмотреть AlarmManager.
Следующий фрагмент кода получит AlarmManager и установить событие произойдет 5 минут от текущего времени:
// get a Calendar object with current time
Calendar cal = Calendar.getInstance();
// add 5 minutes to the calendar object
cal.add(Calendar.MINUTE, 5);
Intent intent = new Intent(ctx, AlarmReceiver.class);
intent.putExtra("alarm_message", "O'Doyle Rules!");
// In reality, you would want to have a static variable for the request code instead of 192837
PendingIntent sender = PendingIntent.getBroadcast(this, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// Get the AlarmManager service
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
Этот фрагмент кода в основном получает новый объект Calendar и добавляет 5 минут к нему. Намерение создается с помощью AlarmReceiver, который мы создали ранее. Более важная часть кода устанавливает флаг FLAG_UPDATE_CURRENT. Без этого флага сообщение, передаваемое как Extra, будет потеряно и не будет получено получателем.
С помощью этих фрагментов кода вы должны иметь возможность создавать и запускать некоторые задачи в BroadcastReceiver. Однако иногда вы можете начать новое мероприятие (или услугу) в событии тревоги. Чтобы сделать это, вы захотите создать AlarmReceiver и запустить новое действие.
Начальная деятельность от BroadcastReceiver Запуск действия в приемнике имеет дополнительный флаг, который необходим. Мы изменим предыдущий OnReceive для AlarmReceiver, чтобы это было сделано:
@Override
public void onReceive(Context context, Intent intent) {
try {
Bundle bundle = intent.getExtras();
String message = bundle.getString("alarm_message");
Intent newIntent = new Intent(context, AlarmActivity.class);
newIntent.putExtra("alarm_message", message);
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(newIntent);
} catch (Exception e) {
Toast.makeText(context, "There was an error somewhere, but we still received an alarm", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
Теперь у вас будет только создать новый AlarmActivity, как вы могли бы сделать любую другую деятельность. Не забудьте включить вновь созданную активность в файл AndroidManifest.xml.
hi ya your right, но на самом деле я хочу выполнить некоторую задачу, например отправить sms в будущем. Для продолжения выполнения этой задачи я назвал активность отправки sms из onstart(), а также код задачи, написанный в onstart(). но когда я вставил запись и callng startervice после кнопки отправки, тогда только вызов вызова службы, но я хочу сохранить работоспособность и работоспособность в случае необходимости., так что я должен делать? Должен ли я привязывать службу к действию? – Sam
как перезапустить службу после завершения текущей задачи службы, чтобы она отправила сообщение в будущем? – Sam
Возможно, от приемника braodcast приступить к обслуживанию при перезагрузке. Проверьте это http://www.androidcompetencycenter.com/2009/06/start-service-at-boot/ –
Вы можете связать его снова, а затем запустить службу. –