在Android通知中实现“稍后提醒”功能

7
什么是在Android通知中实现“小睡”功能的最佳方法?(例如,我通知用户X [举个例子,使用文本消息],他现在不想被打扰,但同时他想确保他不会忘记。所以他希望它在5分钟后再次播放声音)
我看到了Android闹钟的方式,但对我来说,当用户可能正在做重要事情时弹出浮动意图似乎很混乱(而且通常不好)。
另一方面,在通知区域内似乎无法放置按钮。或者我错了吗?
你有什么建议?

我认为你实际上可以在状态栏内添加按钮到通知中。这里有一个例子:http://www.anddev.org/show_notification_in_statusbar-t1019.html - theomega
@theomega,通知中没有提到按钮的事情。你能告诉我你在哪里看到的吗? - yydl
当然了:看看这些屏幕截图,它们正在实现两个操作: 一个是右侧图标被点击时的操作,另一个是通知其余部分的操作。布局还包含一个按钮。 - theomega
1
这不再可能了,那段代码中呈现的通知构造函数在Android中已不再可用。 - Donal Rafferty
3个回答

8
  1. Add a snooze button:

    Button snooze = (Button) findViewById(R.id.snooze);
        snooze.setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View arg0, MotionEvent arg1) {
                 mMediaPlayer.stop();
                 finish();
                 return true;
            }
    });       
    
  2. Then before where you call the alarm, update the time

    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. Call the alarm now.


5
一个简单的策略可能如下:
  • 通知文本可以是“1条新消息。点击此处在5分钟后再次通知”。
  • 如果用户清除了通知,什么也不会发生,通知将被清除。
  • 如果用户点击通知,则清除通知并设置一个计时器,在5分钟后发布新通知。

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

另一种相反的方法是,在发送通知时设置定时器,在打盹时间之后将其删除并添加一个新的通知,具有相应的噪音和可能添加了一些文字,说明自原始通知以来过去了多长时间。这可以递归执行,直到用户清除通知或点击它为止。

最佳策略将取决于应用程序的功能以及用户能够做出的自定义水平。我不会实现任何用户无法轻松防止的打盹行为(如果不能防止,可能会非常烦人)。


1

我已经按照创建第一个闹钟提醒的方式完成了这个操作。

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

    }
}

1
@AiWalidAshik 了不起的解决方案 - Sachin Burdak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接