【问题标题】:Alarm Manager&Broadcast receiver not stopping警报管理器和广播接收器不停止
【发布时间】:2017-03-31 05:34:20
【问题描述】:

我无法停止警报管理器或广播接收器。有什么办法解决这个问题吗?

提前非常感谢。顺便说一句,我正在使用开关按钮来打开/关闭警报。

这是我的代码;

MainActivity.class

public void setAlarm(Calendar alarmCalender)
{
    Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), REQUEST_CODE, intent, 0);
    AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, alarmCalender.getTimeInMillis(), pendingIntent);

}

public void cancelAlarm()
{

    AlarmManager aManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
    PendingIntent pIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    aManager.cancel(pIntent);
    stopService(intent);
}

切换按钮:

bolme1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean aktiflestirmisse)
            {
                if(aktiflestirmisse)
                {
                    setAlarm(calSet);
                    btn1.setBackgroundColor(getResources().getColor(R.color.aktifdurum));
                    Toast t= Toast.makeText(MainActivity.this,"Bölme 1 aktif hale getirildi.",Toast.LENGTH_SHORT);
                    t.show();
                }

                else
                {
                    cancelAlarm();
                    btn1.setBackgroundColor(getResources().getColor(R.color.pasifdurum));
                    Toast t = Toast.makeText(MainActivity.this, "Bölme 1 pasif hale getirildi.", Toast.LENGTH_SHORT);
                    t.show();
                }

无论如何这里是我的 AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver {
NotificationManager manager;
private final int NOTIFICATION_ID =1;
@Override
public void onReceive(Context context, Intent intent) {

    NotificationManager mng=(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
    Notification.Builder nb=new Notification.Builder(context);
    nb.setContentTitle("Hatırlatma");
    nb.setContentText("İlgili bölmenin vakti ilaç vakti geldi!");
    nb.setSmallIcon(R.drawable.alarm_uyari);
    nb.setTicker("Bildiriminiz var.");
    nb.setAutoCancel(true);
    PendingIntent pi=PendingIntent.getActivity(context,NOTIFICATION_ID,intent,0);
    nb.setContentIntent(pi);
    Notification not=nb.getNotification();
    not.vibrate=new long[]{500,500,500,500};
    mng.notify(NOTIFICATION_ID,not);

    Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
    if (alarmUri == null)
    {
        alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    }
    Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri);
    ringtone.play();
}}

【问题讨论】:

    标签: android broadcast alarm receiver


    【解决方案1】:

    我将此代码用于我自己的应用程序:

    创建待处理的意图并包装我们的意图:

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
    id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    
    //get the alarm manager
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    if (android.os.Build.VERSION.SDK_INT >= 23)
    {
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, date.getTime(), pendingIntent);
    }
    else if (android.os.Build.VERSION.SDK_INT >= 19)
    {
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, date.getTime(), pendingIntent);
    }
    else alarmManager.set(AlarmManager.RTC_WAKEUP, date.getTime(), pendingIntent);
    

    取消:

    private void cancelAlarm(long id)
    {
        AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    
        Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
        PendingIntent sender = PendingIntent.getBroadcast(getApplicationContext(), (int)id, intent,  PendingIntent.FLAG_UPDATE_CURRENT);
        alarmManager.cancel(sender);
    }
    

    所以在你的情况下,这可能适用于设置闹钟

    Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, alarmCalender.getTimeInMillis(), pendingIntent);
    

    【讨论】:

    • 是的,它还确保设备在棉花糖上唤醒,打瞌睡很棘手
    • 但我在“id”变量上出现错误。我的意思是,我要调用 cancelAlarm(0) 或 (1) ?
    • 您必须传递一个 id 来告诉警报管理器必须取消哪个警报。此外,您应该在设置警报时传递 PendingIntent.FLAG_UPDATE_CURRENT,我认为请求代码应该替换为您的 id(在您的情况下为 =0)
    • 你能正确地写 setAlarm 吗?因为我不明白。什么是身份证?我应该在哪里定义它?
    • 这意味着我会这样调用cancelAlarm(0)?
    【解决方案2】:

    试试这个取消警报按钮:

    public void cancelAlarm() {
            Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
            final PendingIntent pIntent = PendingIntent.getBroadcast(this, AlarmReceiver.REQUEST_CODE,
                    intent, PendingIntent.FLAG_UPDATE_CURRENT);
            AlarmManager aManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
            aManager.cancel(pIntent);
    }

    不需要stopService;一旦您将 .cancel 传递给 AlarmManager,它将通过广播取消服务。要检查它是否已取消,请在终端“adb shell dumpsys alarm”中运行,然后按您的包名称搜索。有时使用 findstr 或类似方法在终端中搜索警报不会显示实际警报,而只会显示警报/唤醒的历史记录。

    让我知道这是否有效! :)

    【讨论】:

    • 我假设我应该在 AlarmReceiver 中定义 public final int REQUEST_CODE=1 ?
    • 是的,您可以将其设置为任何数字作为标识符
    • 任何号码?我应该定义 final int REQUEST_CODE=1 还是 0?
    • 只需使用 REQUEST_CODE=1,如果您有任何其他警报,请使用不同的编号。
    • 这个代码块也可以工作。但是当我将警报设置为打开然后关闭然后打开时,此代码在 REQUEST_CODE 上出现错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多