如何在Android中处理警报通知?

5
我正在为Android开发一个媒体播放器应用程序,需要处理任何闹钟通知,基于此我将暂停我的播放。当闹铃被打扰或解除时,我会继续播放。
我通过Google搜索了很多闹钟处理的方法,但我找到的都是通过代码启用闹钟通知、设置意图,然后处理它。然而,我无法找到仅处理闹钟通知部分的地方。我不需要设置闹钟,它可能已经由用户设置,并且我不需要以编程方式执行。我只需要处理那个通知。
对此有任何想法将非常有用吗?
谢谢, Asheesh
3个回答

6

你好,Asheesh Vashishtha,

如果其他应用程序被激活,即使是闹钟,您的活动肯定会进入后台。因此,我想您可以重写 OnPauseOnResume 函数来放置您的一点代码。至于小睡或其他事情,它们都将导致闹钟活动被销毁(或暂停,我不太清楚),而您的活动将得到恢复。所以这不会成为您关心的问题!

希望这能帮到你...


1
我在开发媒体播放器时遇到了类似的情况。我的解决方案是使用AudioManager的OnAudioFocusChangeListener
您可以像以下这样在类中实现该监听器。
public class VideoPlayerHelper implements AudioManager.OnAudioFocusChangeListener {

然后你重写onAudioFocusChange方法。
@Override
public void onAudioFocusChange(int focusChange) {
    switch (focusChange) {

        //Just fall through by omitting break
        case AudioManager.AUDIOFOCUS_LOSS:
        case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
            LogUtil.log(LogUtil.DEBUG, TAG, "AUDIOFOCUS_LOSS or AUDIOFOCUS_LOSS_TRANSIENT"); //Custom logging class
            if (isPlaying()) {
                pause();
                mAudioManager.abandonAudioFocus(VideoPlayerHelper.this);
            }
            break;
        case AudioManager.AUDIOFOCUS_GAIN:
            LogUtil.log(LogUtil.DEBUG, TAG, "AUDIOFOCUS_GAIN"); //Custom logging class
            break;
        default:
            break;
    }
}

重点在于AudioManager.AUDIOFOCUS_LOSS_TRANSIENT。当闹钟响起时(在Note 5上),监听器一直收到这个代码。因此,我通过暂停媒体播放器并释放音频焦点来处理AudioManager.AUDIOFOCUS_LOSS_TRANSIENTAudioManager.AUDIOFOCUS_LOSS相同。
当我们设置媒体播放器时,在添加数据源之前,我添加了这行代码。
player.setAudioStreamType(AudioManager.STREAM_MUSIC);

确保你启动媒体播放器的代码也包含这行代码(我在启动代码和onResume代码中都有它,以防闹钟在应用程序在后台时响起)。

mAudioManager.requestAudioFocus(VideoPlayerHelper.this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);

那行代码可以在你关闭闹钟后,帮助你重新获取音频焦点。当你使用完媒体播放器后,也应该释放音频焦点。我将这行代码放在onStop和onDetach方法中。
mAudioManager.abandonAudioFocus(VideoPlayerHelper.this);

你可能认为这需要大量设置,但实际上不是。这使得你可以在出现意外音频(例如闹钟或计时器响起)时调整媒体播放器。


1
据我所知,你无法得知闹钟应用程序的操作情况,就像你无法得知其他第三方闹钟的情况一样。
请注意,AlarmManager(你可能正在阅读的内容)与闹钟应用程序不同。
抱歉!

嗨,CommonsWare,感谢您的回复,但是我找到了可以在闹钟响起时通知我的意图操作。意图操作字符串为“com.android.alarmclock.ALARM_ALERT”。这对我很有效,但是现在我需要处理通过按下闹钟上的Snooze和Dismiss按钮生成的事件。任何帮助都将非常有用。非常感谢, Asheesh - Asheesh Vashishtha
1
那个Intent动作不是SDK的一部分--任何以“com.android”开头的内容都不是SDK的一部分。不要依赖那个Intent。它可能无法在某些设备上使用(那些用自定义应用程序替换了标准闹钟的设备)。此外,它可能无法在未来的Android版本上工作。http://www.androidguys.com/2009/12/14/code-pollution-reaching-past-the-sdk/ - CommonsWare
非常感谢,CommonsWare。所以您建议的是,如果我们不使用Intent操作,就没有其他方式来处理Alarm clock应用程序生成的事件了吗?此外,SDK中没有提供开箱即用的闹钟吗?这是后来添加的功能吗?请纠正我。 - Asheesh Vashishtha
2
还有,SDK中没有提供开箱即用的闹钟吗?SDK是一个编程接口。它不包括应用程序,就像Windows SDK不包括记事本或扫雷一样。 - CommonsWare

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