Intent .putExtra возвращает ноль с PendingIntent - PullRequest
0 голосов
/ 10 декабря 2018

Это приложение позволяет мне запустить сервис, чтобы напомнить мне пить.Если я щелкаю уведомление, я хочу увидеть, работает ли служба или нет, но я не получаю вывод с помощью метода Intent.putExtra.

Мой класс MainActivity:

Boolean isServiceRunning = false;
AlarmManager alarmManager;
PendingIntent pendingIntent;
TextView mainText;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mainText = findViewById(R.id.mainTextView);

    Bundle extras = getIntent().getExtras();
    if (extras == null) {
            mainText.setText("Service is paused");
    } else {
        mainText.setText("Service is running");
    }

}

public void sendNotification(View view) {

    if (!isServiceRunning) {
        isServiceRunning = true;
        Toast.makeText(this, "Reminder service started.", Toast.LENGTH_SHORT).show();
        alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

        mainText.setText("Service is running.");
        Intent i = new Intent(this, reciever.class);
        i.putExtra("isServiceRunning", isServiceRunning.booleanValue());

        pendingIntent = PendingIntent.getBroadcast(this, 100, i, PendingIntent.FLAG_UPDATE_CURRENT);

        Calendar calendar = Calendar.getInstance();
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 10, pendingIntent);
    } else {
        isServiceRunning = false;
        Toast.makeText(this, "Reminder service ended.", Toast.LENGTH_SHORT).show();
        mainText.setText("Service paused.");
        alarmManager.cancel(pendingIntent);
    }
}

Я думаю, что можно решить эту проблему с помощью общих настроек, но это не должно быть хорошим разрешением.

РЕДАКТИРОВАТЬ:

Мой класс приемника вещания:

public class reciever BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    Intent notificationIntent = new Intent(context, drinkReminder.class);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addParentStack(drinkReminder.class);
    stackBuilder.addNextIntent(notificationIntent);

    PendingIntent pendingIntent = stackBuilder.getPendingIntent(100, PendingIntent.FLAG_UPDATE_CURRENT);


    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
    Notification notification = new NotificationCompat.Builder(context, CHANNEL_1_ID)
            .setContentTitle("Title")
            .setContentText("description")
            .setSmallIcon(R.drawable.icon_waterdrop)
            .setTimeoutAfter(30000)
            .setContentIntent(pendingIntent)
            .setAutoCancel(true)
            .build();

    notificationManager.notify(0, notification);

}

}

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Вы добавляете «дополнительные» к Intent, который вы передаете AlarmManager.Это «лишнее» будет в Намерении, которое доставляется на ваш BroadcastReceiver в onReceive(), но вы ничего с этим не делаете.

Когда вы нажимаете на Notification, он запускает drinkReminder, который, я надеюсь, будет Activity.


Вы также сказали в комментарии:

Не могли бы вы сказать мне, пожалуйста, еще одну вещь.Иногда, если я нажимаю кнопку, чтобы запустить службу, уведомление появляется примерно через 10 секунд, после чего оно показывает все 10 минут, как должно.Как я могу это исправить?

Вот ваш код для установки будильника:

Calendar calendar = Calendar.getInstance();
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
    calendar.getTimeInMillis(), 1000 * 60 * 10, pendingIntent);

Когда вы звоните setRepeating(), 2-й параметр указывает первый раз, когда будильник долженвыключить, а 3-й параметр указывает интервал повторения.Вы сказали диспетчеру аварийных сигналов, что вы хотите, чтобы первый аварийный сигнал срабатывал немедленно, а затем каждые 10 минут после этого.

Если вы хотите, чтобы первый аварийный сигнал срабатывал через 10 минут после нажатия кнопки, необходимо настроитьвторой параметр, поэтому он представляет время, которое в будущем будет 10 минут, например:

Calendar calendar = Calendar.getInstance();
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
    calendar.getTimeInMillis() + (1000 * 60 * 10), 1000 * 60 * 10, pendingIntent);
0 голосов
/ 11 декабря 2018

Вместо кода в onCreate () и putExtra () вы можете создать два ожидающих намерения в каждом случае, и каждое намерение использует различный широковещательный приемник.В этом широковещательном приемнике вы можете распечатать отдельные сообщения о тостах.

MyBroadcastRecieverStart.java

 public class MyBroadcastReceiverStart extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {

Toast.makeText(this, "Reminder service started.", Toast.LENGTH_SHORT).show();

}
}

MyBroadcastReceiverStop.java

public class MyBroadcastReceiverStop extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {

Toast.makeText(this, "Reminder service ended.", Toast.LENGTH_SHORT).show();

}
}

Метод SendNotification -

public void sendNotification(View view) {

if (!isServiceRunning) {
    isServiceRunning = true;

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

    mainText.setText("Service is running.");
    Intent i = new Intent(this, MyBroadcastReceiverStart.class);


    pendingIntent = PendingIntent.getBroadcast(this, 100, i, PendingIntent.FLAG_UPDATE_CURRENT);

    Calendar calendar = Calendar.getInstance();
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 10, pendingIntent);
} else {
    isServiceRunning = false;

    mainText.setText("Service paused.");
    Intent i = new Intent(this, MyBroadcastReceiverStop.class);


    pendingIntent = PendingIntent.getBroadcast(this, 100, i, PendingIntent.FLAG_UPDATE_CURRENT);

    Calendar calendar = Calendar.getInstance();
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 10, pendingIntent);
    alarmManager.cancel(pendingIntent);
}
}

Если вы пишете alarmManager.cancel (pendingIntent) в блоке else, он отменяет намерение, которое не существует, поскольку вы создали намерение в блоке if, и оно не создается, если выполняется другое, поэтому я создалнамерение также в блоке else.

...