Android-приложение, которое напоминает пользователю каждое утро

Я пытаюсь сделать приложение, которое каждое утро напоминает пользователю push-уведомлением.

Я использую AlarmManager, BroadcastReceiver и IntentService.

В приведенном ниже коде я тестирую свой AlarmManager с интервалом в 60 секунд.

Проблема: все работает нормально, пока я не выключу приложение, будильники больше не срабатывают.

Есть идеи, куда идти дальше?

Манифест:

<service
    android:name=".IntentMentor"
    android:exported="false" >
</service>

<receiver android:name=".AlertReceiver"
    android:process=":remote">
</receiver>

Основная деятельность:

Intent intent = new Intent(getApplicationContext(), AlertReceiver.class);

final PendingIntent pIntent = PendingIntent.getBroadcast(this, 0,
    intent, PendingIntent.FLAG_UPDATE_CURRENT);

long firstMillis = System.currentTimeMillis();
AlarmManager alarm = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
// 1s is only for testing
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstMillis, 1000*60, pIntent);

Получатель:

public class AlertReceiver extends BroadcastReceiver {

    private static final String TAG = "MyReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "MyReceiver on receive");
        Intent i = new Intent(context, IntentMentor.class);
        context.startService(i);
    }
}

ИнтентСервис:

public class IntentMentor extends IntentService {

    NotificationManager notificationManager;
    int notifID = 33;

    private static final String TAG = "MonitorService";

    public IntentMentor() {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Log.d("TAG", "Service method was fired.");
        pushNotification();
    }

    public void pushNotification(){
        NotificationCompat.Builder notificBuilder = new NotificationCompat.Builder(this);
        notificBuilder.setContentTitle("test");
        notificBuilder.setContentText("this is text");
        notificBuilder.setTicker("this is Ticker?");
        notificBuilder.setSmallIcon(R.drawable.ic_info_black_24dp);
        notificBuilder.setDefaults(NotificationCompat.DEFAULT_SOUND);

        Intent intent = new Intent(this, Card.class);

        TaskStackBuilder tStackBuilder = TaskStackBuilder.create(this);
        tStackBuilder.addParentStack(Card.class);
        tStackBuilder.addNextIntent(intent);

        PendingIntent pendingIntent = tStackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);

        notificBuilder.setContentIntent(pendingIntent);

        notificationManager = (NotificationManager) getSystemService((Context.NOTIFICATION_SERVICE));
        notificationManager.notify(notifID, notificBuilder.build() );
    }
}

person Wiltson    schedule 21.04.2017    source источник
comment
Попробуйте, это может вам помочь   -  person Andy Developer    schedule 21.04.2017
comment
Я пытался найти решение по вашей ссылке. Спасибо .. но у меня все еще та же проблема. Когда приложение не открыто, сигналы тревоги не срабатывают.   -  person Wiltson    schedule 21.04.2017
comment
Убедитесь, что вы даете разрешение на WAKE_LOCK   -  person Andy Developer    schedule 21.04.2017
comment
Попробуйте этот набор кода на своем. Вы можете изменить эту строку alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstMillis, 1000*60, pIntent);   -  person Andy Developer    schedule 21.04.2017
comment
Извините, что я такой нуб.. Но что я должен использовать в намеренииLR. Я не понимаю этого. piLR = PendingIntent.getBroadcast (контекст, 0, намерениеLR, PendingIntent.FLAG_UPDATE_CURRENT);   -  person Wiltson    schedule 21.04.2017
comment
Извиняюсь. Конечно. Спасибо за терпение. Слишком много разочарований с моим кодированием сегодня :)   -  person Wiltson    schedule 21.04.2017
comment
Ok. С этим кодом связан Andy Developer. С моим текущим эмулятором IF ELSE переходит к: amLR.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, interval, pIntent); И таким образом уведомление срабатывает только один раз. По крайней мере, интервал - это что-то другое, чем 60 секунд. Пока только одно уведомление было запущено.   -  person Wiltson    schedule 21.04.2017


Ответы (2)


Попробуйте это, я обновлю ваш основной код действия. Теперь попробуйте это. У меня это работает нормально.

Intent intent = new Intent(getApplicationContext(), AlertReceiver.class);

final PendingIntent pIntent = PendingIntent.getBroadcast(this, 0,
        intent, PendingIntent.FLAG_UPDATE_CURRENT);

long firstMillis = System.currentTimeMillis();
AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);

if (android.os.Build.VERSION.SDK_INT >= 23)
{
   alarm.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
            firstMillis, 1000*60, pIntent);
}
else if (android.os.Build.VERSION.SDK_INT >= 19
        && android.os.Build.VERSION.SDK_INT < 23)
{
    alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP,
            firstMillis, 1000*60, pIntent);
}
else
{
    alarm.setRepeating(AlarmManager.RTC_WAKEUP,
            firstMillis, 1000*60, pIntent);
}
person Andy Developer    schedule 21.04.2017
comment
По какой-то причине alarm.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstMillis, 1000*60, pIntent); на меня не подействует. setAndAllowWhileIdle принимает только 3 параметра? Я просто так потерян... - person Wiltson; 21.04.2017
comment
Я использую: alarm.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, interval, pIntent); И это срабатывает уведомление только один раз. - person Wiltson; 21.04.2017
comment
Вы можете удалить firstmillis для setAndAllow примерно так: alarm.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,1000*60, pIntent); - person Andy Developer; 21.04.2017
comment
@Wiltson, попробуйте этот - person Andy Developer; 21.04.2017
comment
Да, я понял это. Я не могу понять, как работает эта функция setAndAllow.... Когда я запускаю свое приложение, первое уведомление срабатывает сразу. Это неправильно? Должен ли он срабатывать через 60 секунд? Другая проблема заключается в том, что будильник не повторяется. Срабатывает только одно уведомление. - person Wiltson; 21.04.2017
comment
Ok. Спасибо, Энди. Я попробую эту ссылку дальше. - person Wiltson; 21.04.2017
comment
Жаль это говорить. Это решение за ссылкой github.com/commonsguy/cw-omnibus/tree/ master/AlarmManager/ работает неправильно. Он запускает push-уведомления повторно. Но это не работает, если приложение закрыто. - person Wiltson; 21.04.2017

Окончательно. После десяти часов тестирования, сбоя, тестирования, сбоя... Я ранил ответ.

Защищенные приложения на телефонах Huawei

Итак, как вы видите, проблема была с моим телефоном Huawei P8. Приложение должно быть в списке защищенных приложений. Теперь, по крайней мере, пара решений, которые я тестировал, работает нормально.

Спасибо всем за помощь. Я думаю, что Энди и другие решения работают нормально. Но у телефонов Huawei есть особая проблема.

person Wiltson    schedule 21.04.2017