在Android通知中实现暂停

在Android通知中实现暂停function的最佳方法是什么? (即我通知X的用户[为了论据,让我们使用文本消息的例子],他现在不想被它打扰,但同时他想确保他不会忘记所以他确实希望它再次发出噪音,但是从现在开始的5分钟后)

我看到了android闹钟的方式,但对我来说,当用户可能正在做一些重要的事情时,popup浮动意图似乎很麻烦(通常也不好)。

另一方面,似乎不可能将按钮放在通知区域内。 或者我错了?

你会建议什么?

一个简单的策略可能如下:

  • 通知文本可以是“1条新消息。点击此处再次通知5分钟”。
  • 如果用户清除通知,则不会发生任何事情并清除通知。
  • 如果用户单击通知,则清除通知并设置计时器并在5分钟后发布新通知。

或者,如果没有来自用户的其他输入(例如,点击“解除”按钮),则单击通知可以将活动带到将设置计时器的前景。

另一种相反的方法是在发送通知时设置计时器,并在贪睡时间之后删除它并添加一个新的,具有相应的噪声,并且可能添加一个文本,说明自原始通知以来经过了多少时间。 这可以递归完成,直到用户清除通知或点击它。

最佳策略取决于应用程序的function以及用户能够执行的自定义级别。 我不会实现用户不容易阻止的任何snozze行为(如果没有,可能会非常烦人)。

  1. 添加暂停按钮:

    Button snooze = (Button) findViewById(R.id.snooze); snooze.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View arg0, MotionEvent arg1) { mMediaPlayer.stop(); finish(); return true; } }; 
  2. 然后在调用警报之前,更新时间

     Intent intent = new Intent(this, this.getClass()); PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); long currentTimeMillis = System.currentTimeMillis(); long nextUpdateTimeMillis = currentTimeMillis + 5 * DateUtils.MINUTE_IN_MILLIS; Time nextUpdateTime = new Time(); nextUpdateTime.set(nextUpdateTimeMillis); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.RTC, nextUpdateTimeMillis, pendingIntent); 
  3. 拨打闹钟

我完成的方式与我创建第一个警报通知的方式完全相同

  private void startAlarm(Calendar calendar) { AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(this, AlertReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, Config.NOTIFICATION_REQUEST_CODE, intent, 0); //Repeat every 24 hours alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 24*60*60*1000, pendingIntent); } 

因此,对于暂停通知或警报,我刚刚创建了另一个警报但不重复警报。 这只会触发一次

  private void snoozeAlarm() { AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(this, AlertReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, Config.NOTIFICATION_REQUEST_CODE, intent, 0); alarmManager.setExact(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + 5 * 60000, //...start alarm again after 5 minutes pendingIntent); finish(); System.exit(0); //...exit the activity which displayed } 

如果有人需要看一下AlertReceiver.class

  public class AlertReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { intent = new Intent(); intent.setClass(context, DisplayedOnScreen.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); NotificationHelper notificationHelper = new NotificationHelper(context); NotificationCompat.Builder notificationBuilder = notificationHelper.getNotification(); notificationHelper.getManager().notify(1, notificationBuilder.build()); } }