Как запустить будильник без открытия приложения - PullRequest
0 голосов
/ 28 июня 2018

По этому вопросу нужен фоновый сервис.

Как сохранить службу в фоновом режиме даже после того, как пользователь выйдет из приложения?

Я пытался это сделать, но я не могу определить, куда мне следует обращаться к менеджеру аварийных сигналов внутри службы.

MyService.java

Это я попробовал класс обслуживания.

public class MyService extends Service{

    PendingIntent pendingIntent;
    AlarmManager alarmManager;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // Query the database and show alarm if it applies

        // I don't want this service to stay in memory, so I stop it
        // immediately after doing what I wanted it to do.
        pendingIntent = PendingIntent.getBroadcast(
                this.getApplicationContext(), 280192, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 11);
        calendar.set(Calendar.MINUTE, 55);
        calendar.set(Calendar.SECOND,00);

        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_FIFTEEN_MINUTES, pendingIntent);
//        stopSelf();

        return START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
//        // I want to restart this service again in one minute
//        AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE);
//        alarm.set(
//                alarm.RTC_WAKEUP,
//                System.currentTimeMillis() + (1000 * 60 * 1),
//                PendingIntent.getService(this, 0, new Intent(this, MyService.class), 0)
//        );
    }
}

Пожалуйста, сообщите мне напоминание пользователю на определенный период времени, даже если приложение не запущено. Спасибо

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Вам не нужно создавать свой собственный сервис для этого случая использования, для этого вы можете использовать Alarmservice из платформы Android, который может запускать приложение (даже если приложение не запущено) и время, установленное, если телефон включен. , Теперь для установки будильника звонить можно в любом виде (Activity / Fragment). Вы можете создать кнопку и установить действие, чтобы установить будильник, как вам нравится. При вызове тревоги вы используете ожидающий широковещательный приемник для любого последующего действия. Позвоните для установки будильника, как показано ниже, вы можете использовать намерение Pending Broadcast, чтобы сделать ваши вещи. И поверьте мне, это будет работать, даже если ваше приложение не запущено. Примечание. AlarmBroadCastReceiver должен быть получателем манифеста, т.е. объявленным в файле манифеста.

private void setAlarm(int type) {


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

    // Alarm type
    int alarmType = AlarmManager.RTC;

    Calendar time = Calendar.getInstance();

    time.setTimeInMillis(System.currentTimeMillis());


    switch (type) {

    case 1:
        // Set Alarm for next 20 seconds
        time.add(Calendar.SECOND, 20);
        break;

    case 2:
        // Set Alarm for next 2 min
        time.add(Calendar.MINUTE, 2);
        break;

    case 3:
      // Set Alarm for next 30 mins
        time.add(Calendar.MINUTE, 30);
        break;

    }


    Intent broadcastIntent = new Intent(this, AlarmBroadCastReceiver.class);

    broadcastIntent.putExtras(sourceIntent);

    Random generator = new Random();

    PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(this,
            generator.nextInt(), broadcastIntent,
            PendingIntent.FLAG_ONE_SHOT);
    alarmManager.set(alarmType, time.getTimeInMillis(), pendingAlarmIntent);

}
0 голосов
/ 28 июня 2018

Сначала создайте BroadcastReceiver, как показано ниже:

public class SchedulerSetupReceiver extends BroadcastReceiver {
    private static final String APP_TAG = "com.hascode.android";

    private static final int EXEC_INTERVAL = 20 * 1000;

    @Override
    public void onReceive(final Context ctx, final Intent intent) {
        Log.d(APP_TAG, "SchedulerSetupReceiver.onReceive() called");
        AlarmManager alarmManager = (AlarmManager) ctx
                .getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(ctx, SchedulerEventReceiver.class); // explicit
                                                                    // intent
        PendingIntent intentExecuted = PendingIntent.getBroadcast(ctx, 0, i,
                PendingIntent.FLAG_CANCEL_CURRENT);
        Calendar now = Calendar.getInstance();
        now.add(Calendar.SECOND, 20);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                now.getTimeInMillis(), EXEC_INTERVAL, intentExecuted);
    }

}

Теперь мы создаем второй широковещательный приемник, чтобы поймать наше явное намерение, запущенное из AlarmManager.

public class SchedulerEventReceiver extends BroadcastReceiver {
private static final String APP_TAG = "com.hascode.android";

@Override
public void onReceive(final Context ctx, final Intent intent) {
    Log.d(APP_TAG, "SchedulerEventReceiver.onReceive() called");
    Intent eventService = new Intent(ctx, SchedulerEventService.class);
    ctx.startService(eventService);
}

}

Обслуживание ручки как:

public class SchedulerEventService extends Service {
private static final String APP_TAG = "com.hascode.android.scheduler";

@Override
public IBinder onBind(final Intent intent) {
    return null;
}

@Override
public int onStartCommand(final Intent intent, final int flags,
        final int startId) {
    Log.d(APP_TAG, "event received in service: " + new Date().toString());
    return Service.START_NOT_STICKY;
}

}

Это может помочь вам обрабатывать периодически запланированные задачи.

...