在Android通知中实现暂停

时间:2011-04-21 15:53:22

标签: android notifications alarmmanager

在Android通知中实施暂停功能的最佳方式是什么? (即我通知X的用户[为了论据的缘故,让我们使用短信的例子],他现在不想被它打扰,但同时他想确保他不会忘记所以他确实希望它再次发出噪音,但是从现在开始的5分钟时间

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

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

你会建议什么?

3 个答案:

答案 0 :(得分:7)

  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. 拨打闹钟

答案 1 :(得分:5)

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

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

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

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

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

答案 2 :(得分:0)

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

  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());

    }
}