当前位置: 首页 > 知识库问答 >
问题:

报警管理器和广播接收器未停止

梅修贤
2023-03-14

我想在多个特定的日期和时间上创建通知,这些日期和时间存储在数据库中。我可以在正确的日期和时间得到通知,但我后来注意到,我也在第二天随机得到通知。每当我重新启动模拟器时,它们就会出现。

所以,似乎我不能停止报警管理器或广播接收器。我曾尝试向AlarmManager的cancel方法提供pendingIntent,但没有成功。我也使用切换按钮来启用/禁用通知,但没有效果

下面是我的代码

PendingIntent pendingIntent;
    AlarmManager alarmManager;
    Button set, cancel;
    MTPAdapter db;
    ArrayList<TourPlan> arrDates;

    ToggleButton toggle;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        toggle = (ToggleButton) findViewById(R.id.toggleButton1);

                // This function fetched data from DB
        fetchDates();



        set = (Button) findViewById(R.id.the_button);
        cancel = (Button) findViewById(R.id.the_button_cancel);
        cancel.setEnabled(false);



        toggle.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                // TODO Auto-generated method stub
                if (isChecked) {
                    Toast.makeText(getApplicationContext(), "Set",
                            Toast.LENGTH_SHORT).show();
                    setEvent();
                } else {
                    alarmManager.cancel(pendingIntent);
                    MyReceiver.stopService(getApplicationContext());
                }
            }
        });
    } // end onCreate

    public void setEvent() {

        for (int i = 0; i < arrDates.size(); i++) {
            // int id = arrDates.get().getId();

            int year = Integer.parseInt(arrDates.get(i).getYear());

            int month = Integer.parseInt(arrDates.get(i).getMonth());

            int date = Integer.parseInt(arrDates.get(i).getDate());

            int hour = Integer
                    .parseInt(firstStringer(arrDates.get(i).getTime()));
            Log.v("Hour : ", "" + hour);

            int minute = Integer.parseInt(stringer(arrDates.get(i).getTime()));
            Log.v("minute : ", "" + minute);
            int second = 00;
            startAlarm(i, year, month, date, hour, minute, second);
        }
    }

    public void startAlarm(int id, int year, int month, int date, int hour,
            int minute, int second) {
        Calendar calendar = Calendar.getInstance();

        calendar.set(Calendar.MONTH, month);
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.DAY_OF_MONTH, date);

        calendar.set(Calendar.HOUR_OF_DAY, hour);
        calendar.set(Calendar.MINUTE, minute);
        calendar.set(Calendar.SECOND, 0);
        // calendar.set(Calendar.AM_PM, Calendar.PM);

        Intent myIntent = new Intent(MainActivity.this, MyReceiver.class);

        pendingIntent = PendingIntent.getBroadcast(MainActivity.this, id,
                myIntent, 0);

        alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(),
                pendingIntent);
    }


    }
public class MyAlarmService extends Service {


    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
    }

    @SuppressWarnings("static-access")
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);



        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                this)
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("ISFA")
                .setStyle(
                        new NotificationCompat.BigTextStyle()
                                .bigText("Tour Planned for the Day"))
                .setContentText("You have planned a tour for today")
                .setAutoCancel(true);

        mBuilder.setContentIntent(contentIntent);
        mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    }
  public class MyReceiver extends BroadcastReceiver {

            @Override
            public void onReceive(Context context, Intent intent) {

                Intent service1 = new Intent(context, MyAlarmService.class);
                context.startService(service1);

            }

            public static void stopService(Context context) {
                Intent stopServiceIntent = new Intent(context, MyAlarmService.class);
                context.stopService(stopServiceIntent);
            }
        }
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
 <service
           android:name="com.example.brodcastalarm.MyAlarmService"
           android:enabled="true" />
   <!-- THE BROADCAST RECIEVER WHICH MANAGES THE BROADCAST FOR NOTIFICATION -->
            <receiver android:name="com.example.brodcastalarm.MyReceiver" >
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                </intent-filter>
            </receiver>

这是数据库结构。我使用子字符串方法来获得小时和分钟。

共有1个答案

颜昕
2023-03-14

警报管理器需要手动禁用,因此使用下面的代码,它将禁用警报。

AlarmManager aManager = (AlarmManager) getSystemService(ALARM_SERVICE);         
Intent intent = new Intent(getBaseContext(), YourScheduleClass.class);      
PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent,              PendingIntent.FLAG_UPDATE_CURRENT);         
aManager.cancel(pIntent);
 类似资料:
  • 嗨,我有一个应用程序,比如应用程序(不是应用程序),它检查当前运行的应用程序与用户选择的应用程序列表,如果匹配,那么我有我的代码。我有一个服务,它没有任何循环调用StartupRec 我的服务.class startup接收方。班级 } 检查正在运行的应用程序接收器。类 < li >以下是我观察到的情况,当我将闹钟时间设置为10ms时,我的手机在连接到笔记本电脑时,手机的检测在15秒钟后发生延迟,

  • 问题内容: 有人可以解释和之间的确切区别吗? 在什么情况下我们必须使用每个Receiver类? 问题答案: 和之间只有一个区别。 当您收到内部广播方法时, 假设, BroadcastReceiver : 它 不保证 该 CPU将保持清醒 ,如果你启动一些长时间运行的进程。CPU可能会立即回到睡眠状态。 WakefulBroadcastReceiver : 这是 保证 该 CPU将保持清醒 ,直到你

  • 我创建了一个应用程序与报警管理器和广播接收器,我想通过字符串从主要活动到公共类MySchduleRecector扩展BroadcastRecector(我有报警管理器里面),然后到公共类MyStartServiceRecector扩展BroadcastRecector传递数据到静态函数......在主活动中,从具有共享首选项的编辑框中保存此变量。但是我不能在接收器内使用共享偏好。我怎么能做到这一点

  • 通知广播接收机: 谁能帮帮我吗?我不知道我做错了什么

  • 我目前正在使用SharedReferences跟踪通过AlarmManager启动的BroadcastReceiver中要执行工作的项列表。除了一个特定的场景外,一切都很好。当我触发一个新项目来执行工作时,让它完成工作,然后删除该项目(全部通过SharedReferences编辑),它在应用程序运行时工作得很好。当列表中没有任何内容,我打开任务管理器并终止应用程序时,该项突然出现在Broadcas

  • 问题内容: 我正在尝试从广播接收器启动状态栏通知,然后从另一个广播接收器停止它,但是出现问题。当USB连接时,我想在状态栏中启动通知,然后当USB断开连接时,我想停止它。我已经设置了两个接收器,并且正在努力从接收器中启动和停止一个接收器,这是代码我目前有 我的代码唯一的错误是该行,该错误仅表明getSystemService未定义,并且它想使该方法(我认为这意味着接收者不像活动那样支持该方法),所