2011-11-16 4 views
0

Привет, у меня есть код напоминания в сервисе onstart(). Когда пользователь вставляет дату и время записи в службу времени, вызываемую функцией startservice(), но только служба запускается, когда я вставляю запись, т.е. я получаю напоминание, когда он получает звонок от моей деятельности. Но я хочу напоминание после 3 дней или что-то в этом роде, так как я должен постоянно поддерживать сервис, чтобы я мог получить напоминание в будущем? или как я должен подключиться к сервису, чтобы он продолжал жить? Должен ли я вызвать функцию bindservice() из моей какой-либо деятельности или что? заранее заранее ---Как сохранить службу приложений всегда в android2.1?

ответ

0

Во-первых, нет необходимости в обслуживании, вы можете использовать AlarManagerClass Link класс Alarmanger для событий расписания и показывать предупреждения в определенное время и дату. Если вы хотите показывать сообщения после некоторой продолжительной продолжительности, тогда планируйте Ожидание намерения через AlarmManager, который запускает сервис в соответствующий момент времени, чтобы выполнить его работу. Когда закончите, снова запустите службу, как описано выше. Кроме того, вы можете хранить свои данные в общих настройках навсегда. Вы можете получить его в любое время для его возобновления при перезагрузке устройства или для других целей.

+0

как перезапустить службу после завершения текущей задачи службы, чтобы она отправила сообщение в будущем? – Sam

+0

Возможно, от приемника braodcast приступить к обслуживанию при перезагрузке. Проверьте это http://www.androidcompetencycenter.com/2009/06/start-service-at-boot/ –

+0

Вы можете связать его снова, а затем запустить службу. –

2

Не позволяйте вашей службе работать все время. Он потребляет аккумулятор и память, если это не обязательно. Скорее назначьте 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 минут с этого момента. Существует много документации для отправки намерений таким образом, поиск немного вокруг.

¹ Который в конечном итоге сорвет ваших пользователей: «Почему это приложение растрачивает мою батарею?» является довольно распространенным вопросом

0

Иногда приложение для 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.

+0

hi ya your right, но на самом деле я хочу выполнить некоторую задачу, например отправить sms в будущем. Для продолжения выполнения этой задачи я назвал активность отправки sms из onstart(), а также код задачи, написанный в onstart(). но когда я вставил запись и callng startervice после кнопки отправки, тогда только вызов вызова службы, но я хочу сохранить работоспособность и работоспособность в случае необходимости., так что я должен делать? Должен ли я привязывать службу к действию? – Sam