#java #android #broadcastreceiver #android-notifications
#java #Android #broadcastreceiver #android-уведомления
Вопрос:
В настоящее время я работаю над приложением для Android, которое получает Push-уведомления. Теперь отображаемые мной уведомления обычно имеют кнопку действия, которая должна выполнять действие, подобное показанному в приведенном ниже фрагменте кода:
public class PushReceiver extends BroadcastReceiver implements RequestCallbacks {
private RequestHandler requestHandlerInstance;
private SessionHandler sessionHandlerInstance;
private Context context;
@Override
public void onReceive(Context context, Intent intent) {
this.context = context.getApplicationContext();
requestHandlerInstance = RequestHandler.getInstance(context);
sessionHandlerInstance = SessionHandler.getInstance(context);
String id = intent.getStringExtra("error_id");
requestHandlerInstance.startRequest(new RequestOperation(RequestOperation.Type.ERROR_TAKE_OVER, sessionHandlerInstance.getDeviceHash(), id), this);
}
#these are callbacks that will be executed
#when starRequest() returns a response
@Override
public void onSuccess(JSONObject json, String parsingKey) {
#request was successful
}
@Override
public void onError(VolleyError error, String parsingKey) {
#request failed, activating panic mode
}
@Override
public void onFinished(String parsingKey) {
#here i plan to dismiss the notification box,
#but this doesn't seem to be the correct approach
#as the box is still there
Intent intent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.sendBroadcast(intent);
}
}
У кого-нибудь есть правильное решение, как закрыть окно уведомлений? Ответ пользовательского интерфейса на событие onClick в настоящее время не требуется. Или мне нужно отправить новое намерение из моего MessagingService, которое как бы переопределяет предыдущее уведомление?
Для большей ясности вот как я создаю свое уведомление:
Notification notification;
Intent activityIntent = new Intent(this.getApplicationContext(), MainActivity.class);
activityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(this.getApplicationContext(), REQUEST_CODE, activityIntent, PendingIntent.FLAG_ONE_SHOT);
Intent broadcastIntent = new Intent(this, PushReceiver.class);
broadcastIntent.putExtra("error_id", remoteMessage.getData().get("id"));
PendingIntent actionIntent = PendingIntent.getBroadcast(this, REQUEST_CODE, broadcastIntent, PendingIntent.FLAG_ONE_SHOT);
notification = new NotificationCompat.Builder(this, getString(R.string.default_notification_channel_id))
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(remoteMessage.getData().get("notification_title"))
.setContentText(remoteMessage.getData().get("notification_text"))
.setSound(settingsHandlerInstance.getRingtoneUri())
.setVibrate(settingsHandlerInstance.shouldVibrateOnPush() ? new long[] {0, 500, 200, 500, 0} : new long[] {0, 0, 0, 0, 0 })
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_MESSAGE)
.setContentIntent(contentIntent)
.addAction(R.mipmap.ic_launcher, "Übernehmen", actionIntent)
.setAutoCancel(true)
.build();
Комментарии:
1. Вы можете вызвать «cancel (int id)» для объекта NotificationManager. Но вы должны отслеживать идентификатор уведомления.
2. так сказать, могу ли я передать notification_id в качестве дополнительного намерения и вызвать cancel() внутри pushReceiver ?
3. да, попробуйте и посмотрите, работает ли это для вас. Убедитесь, что вы можете получить доступ к объекту NotificationManager из pushReceiver
4. Это может быть предостережением, диспетчер уведомлений является атрибутом моего MessagingService. Должен ли это быть один и тот же объект?
5. есть ли какой-либо способ передать NotificationManagerCompat моему BroadcastReceiver по намерению?
Ответ №1:
Где вы показываете сведения об уведомлении.
int notifId = new Random().nextInt();
PendingIntent dismissIntent = NotificationActivity.getDismissIntent(notifId, context);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setPriority(NotificationCompat.PRIORITY_MAX)
.setDefaults(Notification.DEFAULT_ALL)
.setSmallIcon(R.drawable.app_icon)
.setContentTitle("Title")
.setContentText("Content Text")
.setAutoCancel(true)
//You use addAction to include the dismiss button. The click action is to remove the notification. You can handle any action here as desired to function with the dismiss button.
.addAction(R.drawable.ic_cancel, "Dismiss", dismissIntent);
NotificationManager notifManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notifManager.notify(notificationId, builder.build());
Комментарии:
1. что вы пытаетесь сказать этим случайным фрагментом кода?
2. Мне кажется возможным, но я хочу, чтобы уведомление было отклонено после нажатия кнопки действия, что делает что-то другое. Я добавлю код, в котором я создаю свое уведомление через секунду
3. Это то, что делает .addAction . Он отклонит уведомление после нажатия кнопки «Отклонить».
4. Но я хочу выполнить другое действие, нажав кнопку, например, отправить запрос. И в качестве обратного вызова, когда ответ возвращается, чтобы отклонить уведомление.
5. О, хорошо. Вы могли бы поделиться тем, где вы создаете свое уведомление. @TimCastelijns Возможно, я не понимаю, что вы подразумеваете под «случайным фрагментом кода». У вас есть лучшее решение, которым я поделился, которое, конечно, работает для меня?