每次 phone 启动时如何阻止 RTC_WAKEUP 被调用?
How do you stop RTC_WAKEUP from being called everytime the phone boots?
在我的项目中,无论我在什么时间或日期发出通知,每次 phone 启动时都会调用 RTC_WAKEUP 方法。
我的问题是,如何才能让 phone 在用户需要通知时才发出通知,而不是在启动时自动发出通知?
我的长变量timeDateNotification可以在这些里面找到类:
public static class TimePickerFragment extends DialogFragment
implements TimePickerDialog.OnTimeSetListener {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
return new TimePickerDialog(getActivity(), this, hour, minute,
DateFormat.is24HourFormat(getActivity()));
}
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
cal.set(Calendar.MINUTE, view.getCurrentMinute());
cal.set(Calendar.HOUR_OF_DAY, view.getCurrentHour());
timeDateNotification = cal.getTimeInMillis();
}
}
public static class DatePickerFragment extends DialogFragment
implements DatePickerDialog.OnDateSetListener {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
return new DatePickerDialog(getActivity(), this, year, month, day);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
cal.set(Calendar.YEAR, view.getYear());
cal.set(Calendar.MONTH, view.getMonth());
cal.set(Calendar.DAY_OF_MONTH, view.getDayOfMonth());
timeDateNotification = cal.getTimeInMillis();
}
}
这是导致所有问题的方法。
Intent intent = new Intent(getActivity(), AlertClass.class);
AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, timeDateNotification, PendingIntent.getBroadcast(getActivity()
.getApplicationContext(), 1, intent, PendingIntent.FLAG_UPDATE_CURRENT));
Toast.makeText(getActivity(), "Notification sent!" ,Toast.LENGTH_SHORT).show();
这是 AlertClass:
public class AlertClass extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
CreateNotification(context, "Forgetting something?", "Click here for more details", "Alert");
}
private void CreateNotification(Context context, String title, String text, String alert) {
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, new Intent(context, MainActivityTrekkly.class), 0);
NotificationCompat.Builder notification = new NotificationCompat.Builder(context)
.setTicker(alert)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle(title)
.setContentText(text)
.setDefaults(Notification.DEFAULT_SOUND)
.setAutoCancel(true);
notification.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(1, notification.build());
}
}
谢谢。
以下代码解决了这个问题。先关闭接收器再取消通知
ComponentName receiver = new ComponentName(getActivity(), AlertClass.class);
PackageManager pm = getActivity().getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
Intent intent = new Intent(getActivity(), AlertClass.class);
AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(PendingIntent.getBroadcast(getActivity()
.getApplicationContext(), 1, intent, PendingIntent.FLAG_UPDATE_CURRENT));
在我的项目中,无论我在什么时间或日期发出通知,每次 phone 启动时都会调用 RTC_WAKEUP 方法。
我的问题是,如何才能让 phone 在用户需要通知时才发出通知,而不是在启动时自动发出通知?
我的长变量timeDateNotification可以在这些里面找到类:
public static class TimePickerFragment extends DialogFragment
implements TimePickerDialog.OnTimeSetListener {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
return new TimePickerDialog(getActivity(), this, hour, minute,
DateFormat.is24HourFormat(getActivity()));
}
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
cal.set(Calendar.MINUTE, view.getCurrentMinute());
cal.set(Calendar.HOUR_OF_DAY, view.getCurrentHour());
timeDateNotification = cal.getTimeInMillis();
}
}
public static class DatePickerFragment extends DialogFragment
implements DatePickerDialog.OnDateSetListener {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
return new DatePickerDialog(getActivity(), this, year, month, day);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
cal.set(Calendar.YEAR, view.getYear());
cal.set(Calendar.MONTH, view.getMonth());
cal.set(Calendar.DAY_OF_MONTH, view.getDayOfMonth());
timeDateNotification = cal.getTimeInMillis();
}
}
这是导致所有问题的方法。
Intent intent = new Intent(getActivity(), AlertClass.class);
AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, timeDateNotification, PendingIntent.getBroadcast(getActivity()
.getApplicationContext(), 1, intent, PendingIntent.FLAG_UPDATE_CURRENT));
Toast.makeText(getActivity(), "Notification sent!" ,Toast.LENGTH_SHORT).show();
这是 AlertClass:
public class AlertClass extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
CreateNotification(context, "Forgetting something?", "Click here for more details", "Alert");
}
private void CreateNotification(Context context, String title, String text, String alert) {
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, new Intent(context, MainActivityTrekkly.class), 0);
NotificationCompat.Builder notification = new NotificationCompat.Builder(context)
.setTicker(alert)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle(title)
.setContentText(text)
.setDefaults(Notification.DEFAULT_SOUND)
.setAutoCancel(true);
notification.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(1, notification.build());
}
}
谢谢。
以下代码解决了这个问题。先关闭接收器再取消通知
ComponentName receiver = new ComponentName(getActivity(), AlertClass.class);
PackageManager pm = getActivity().getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
Intent intent = new Intent(getActivity(), AlertClass.class);
AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(PendingIntent.getBroadcast(getActivity()
.getApplicationContext(), 1, intent, PendingIntent.FLAG_UPDATE_CURRENT));