IntentService не начнет использовать AlarmManager

Я знаю, что есть много вопросов об этом, но я действительно не знаю, где моя ошибка.

Моя служба зарегистрирована в файле AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.app" >
        ...
        <service android:name="com.example.android.app.ScheduledService">
        </service>
    </application>
</manifest>

Моя служба расширяет IntentService

public class ScheduledService extends IntentService {
    public ScheduledService() {
        super("ScheduledService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Log.d(getClass().getSimpleName(), "I ran!");
    }
}

Моя активность запускает сервис

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d(getClass().getSimpleName(), "Setting alarm!!");

        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

        Intent alarmIntent = new Intent(this, com.example.android.app.ScheduledService.class);
        PendingIntent pending = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);

        alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime() +
                        10 * 1000, pending);
    }
}

Я не вижу никаких исключений в журналах. Есть ли что-то еще, что я должен сделать, чтобы настроить будильник?

Ответ 1

Как и в документации, PendingIntent.getBroadcast() используется для извлечения PendingIntent, который будет выполнять широковещательную передачу, например, вызов Context.sendBroadcast().

Вместо этого вам нужно вызвать PendingIntent.getService(), который запустит IntentService:

PendingIntent pending = PendingIntent.getService(this, 0, alarmIntent, 0);

Ответ 2

Посмотрите внимательно на API AlarmManager и PendingIntent. API AlarmManager.set() ожидает намерения трансляции, которое вы предоставляете. Однако вы пытаетесь отправить намерение трансляции на службу, что невозможно. Просто создайте BroadcastReceiver, чтобы поймать Intent, и ваш БР должен начать свою службу.

Ответ 3

API говорит:

обычно поступает из IntentSender.getBroadcast().

что означает, что PendingIntent.getService тоже может работать. Я тестировал его, и он работает.