2015-02-16 2 views
1

Привет, прочитанный другой вопрос ответил на это, но ответы никогда не разрешают мою проблему.Запуск службы Alarm Manager на Android?

Я хочу, чтобы запустить службу по истечении определенного времени с менеджером Alarm

alarmMgr = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE); 

    alarmServiceIntent=new Intent(ListActivity.this, AlarmLevelServiceImproved.class); 
    alarmServiceIntent.putExtra("username",usernameID); 
    alarmServiceIntent.putExtra("password",userPass); 
    alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmServiceIntent, 0); 

    . . . 

    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.add(Calendar.SECOND,10); 
    //calendar.set(Calendar.HOUR_OF_DAY, 19); 

    //alarmMgr.setInexactRepeating(AlarmManager.RTC,calendar.getTimeInMillis(), 
    //  AlarmManager.INTERVAL_HALF_HOUR,alarmIntent); 
    //alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
    //  1000 * 10, alarmIntent); 
    alarmMgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), alarmIntent); 
    Log.d("MioLog", "Alarm setted"); 

Моя служба:

public class AlarmLevelServiceImproved extends Service { 

@Override 
public void onCreate() { 
    Log.d("MioLog","MyAlarmService.onCreate()"); 
    Toast.makeText(this, "MyAlarmService.onCreate()", Toast.LENGTH_LONG).show(); 
} 
@Override 
public IBinder onBind(Intent intent) { 
    Log.d("MioLog","MyAlarmService.onBind()"); 
    Toast.makeText(this, "MyAlarmService.onBind()", Toast.LENGTH_LONG).show(); 
    return null; 
} 
@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Log.d("MioLog","MyAlarmService.onDestroy()"); 
    Toast.makeText(this, "MyAlarmService.onDestroy()", Toast.LENGTH_LONG).show(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.d("MioLog","MyAlarmService.onStart()"); 
    Toast.makeText(this, "MyAlarmService.onStart()", Toast.LENGTH_LONG).show(); 
    return super.onStartCommand(intent, flags, startId); 

} 
} 

И я добавляю это на AndroidManifest.xml (класс обслуживания на подпакет «услуги»):

<service 
     android:name=".services.AlarmLevelServiceImproved" 
     android:enabled="true" /> 

Но служба не запускается и журнал не печатается.

Любая идея, как запустить службу с помощью AlarmManager?

Я также suived this tutorial, но я не нахожу никакой разницы в моем коде

Благодарности

+0

Ну, вы не начинаете свое обслуживание нигде. Вам нужно запустить его как 'startService (новый Intent (этот, AlarmLevelServiceImproved .class));' – Marcus

+0

Да, я могу запустить сервис вручную, но мне нужно, чтобы обслуживание начнется каждые X секунд. Как это сделать с помощью AlarmManager? – Simoyw

ответ

1

Чтобы запустить службу с PendingIntent, вам нужно использовать статический метод PendingIntent.getService() для получения соответствующего PendingIntent.

Ваш код, по-видимому, использует PendingIntet.getBroadcast() по любой причине. Если вы собираетесь иметь AlarmManager действительно отправить радиопередачу, вы можете начать свой сервис в вашем BroadcastReceiver, иначе изменить эту строку в GetService():

из

alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmServiceIntent, 0); 

в

alarmIntent = PendingIntent.getService(getApplicationContext(), 0, alarmServiceIntent, 0); 
+0

Да работает сейчас. Была банальная ошибка. Благодаря! – Simoyw

+0

не работает для меня –

1

Вы используете getBroadcast() для создания PendingIntent, но Intent указывает на услугу. Эта комбинация не будет работать.

Поскольку вы используете RTC_WAKEUP, для получения надежных результатов поиска необходимо использовать getBroadcast() и WakeLock. Один из подходов состоит в том, чтобы использовать WakefulBroadcastReceiver в качестве базового класса вашего ресивера, после чего вы переводите работу на IntentService.

Кроме того, пожалуйста, не вводите имена пользователей и пароли в дополнительных целях, поскольку они видны всем, что попадает в руки Intent или PendingIntent. В этом случае должен просто быть вашим приложением и основной ОС, но я все равно хотел бы сделать что-то более безопасное.

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