AlarmManager 没有取消
AlarmManager not canceling
您好,我是 android 的新手,我正在尝试制作一个可以在设备充电时检查电池状态的应用程序。如果电池电量超过设置中定义的水平,它将显示通知并响铃。
我现在正在测试它,并且在每次 30 second
插入设备后 showing notification
。根据我的逻辑 alarm manger
将在设备插入时设置,并在设备 plugged out
.
时设置 cancel pending of alarm manager
但它不起作用,通知也显示 after disconnecting device
。我不知道为什么会这样。我试图取消挂起,但它不起作用。
请帮我看看这是怎么回事。
自定义接收器
public class CustomReceiver extends BroadcastReceiver {
AlarmManager alarmManager;
PendingIntent p;
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
if (intentAction != null) {
if (intentAction.equals(Intent.ACTION_POWER_CONNECTED)) {
toast("Power Connected", context);
setBatteryAlarm(context);
}
if (intentAction.equals(Intent.ACTION_POWER_DISCONNECTED)) {
toast("Power Disconneted", context);
cancelAlarm();
}
}
}
public void toast(String msg, Context context) {
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
private void setBatteryAlarm(Context context) {
Intent notifyIntent = new Intent(context, BatteryCheckingReciever.class);
p = PendingIntent.getBroadcast(context, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
long repeatInterval = 30000;
long triggerTime = SystemClock.elapsedRealtime() + repeatInterval;
alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerTime, repeatInterval, p);
}
private void cancelAlarm() {
Log.e("kiran", "canceling alarm");
if (alarmManager != null) {
alarmManager.cancel(p);
alarmManager = null;
}
}
}
通知的广播接收者
public class BatteryCheckingReciever extends BroadcastReceiver {
NotificationManager notificationManager;
int NOTIFICATION_ID = 0;
String PRIMARY_CHANNEL = "battery_is_full";
@Override
public void onReceive(Context context, Intent intent) {
showNotificaiton(context);
}
private void showNotificaiton(Context context) {
notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, PRIMARY_CHANNEL)
.setSmallIcon(R.drawable.ic_battery_full)
.setContentTitle(context.getString(R.string.battery_full))
.setContentText(context.getString(R.string.battery_full_text))
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setAutoCancel(true)
.setDefaults(NotificationCompat.DEFAULT_ALL);
notificationManager.notify(NOTIFICATION_ID, builder.build());
}
}
清单文件
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<receiver
android:name=".BatteryCheckingReciever"
android:enabled="true"
android:exported="true"></receiver>
<receiver
android:name=".CustomReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
</intent-filter>
</receiver>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
抱歉英语不好。
这是因为您对警报管理器和未决意图的引用发生了变化。很可能您的警报管理器变为空,但因为您正在进行空检查,所以您没有错误。您需要再次引用相同的对象
像这样更改您的代码:
private void cancelAlarm() {
alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent notifyIntent = new Intent(context, BatteryCheckingReciever.class);
p = PendingIntent.getBroadcast(context, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
if (alarmManager != null) {
Log.e("kiran", "canceling alarm");
alarmManager.cancel(p);
alarmManager = null;
}
}
您好,我是 android 的新手,我正在尝试制作一个可以在设备充电时检查电池状态的应用程序。如果电池电量超过设置中定义的水平,它将显示通知并响铃。
我现在正在测试它,并且在每次 30 second
插入设备后 showing notification
。根据我的逻辑 alarm manger
将在设备插入时设置,并在设备 plugged out
.
cancel pending of alarm manager
但它不起作用,通知也显示 after disconnecting device
。我不知道为什么会这样。我试图取消挂起,但它不起作用。
请帮我看看这是怎么回事。
自定义接收器
public class CustomReceiver extends BroadcastReceiver {
AlarmManager alarmManager;
PendingIntent p;
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
if (intentAction != null) {
if (intentAction.equals(Intent.ACTION_POWER_CONNECTED)) {
toast("Power Connected", context);
setBatteryAlarm(context);
}
if (intentAction.equals(Intent.ACTION_POWER_DISCONNECTED)) {
toast("Power Disconneted", context);
cancelAlarm();
}
}
}
public void toast(String msg, Context context) {
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
private void setBatteryAlarm(Context context) {
Intent notifyIntent = new Intent(context, BatteryCheckingReciever.class);
p = PendingIntent.getBroadcast(context, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
long repeatInterval = 30000;
long triggerTime = SystemClock.elapsedRealtime() + repeatInterval;
alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerTime, repeatInterval, p);
}
private void cancelAlarm() {
Log.e("kiran", "canceling alarm");
if (alarmManager != null) {
alarmManager.cancel(p);
alarmManager = null;
}
}
}
通知的广播接收者
public class BatteryCheckingReciever extends BroadcastReceiver {
NotificationManager notificationManager;
int NOTIFICATION_ID = 0;
String PRIMARY_CHANNEL = "battery_is_full";
@Override
public void onReceive(Context context, Intent intent) {
showNotificaiton(context);
}
private void showNotificaiton(Context context) {
notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, PRIMARY_CHANNEL)
.setSmallIcon(R.drawable.ic_battery_full)
.setContentTitle(context.getString(R.string.battery_full))
.setContentText(context.getString(R.string.battery_full_text))
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setAutoCancel(true)
.setDefaults(NotificationCompat.DEFAULT_ALL);
notificationManager.notify(NOTIFICATION_ID, builder.build());
}
}
清单文件
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<receiver
android:name=".BatteryCheckingReciever"
android:enabled="true"
android:exported="true"></receiver>
<receiver
android:name=".CustomReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
</intent-filter>
</receiver>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
抱歉英语不好。
这是因为您对警报管理器和未决意图的引用发生了变化。很可能您的警报管理器变为空,但因为您正在进行空检查,所以您没有错误。您需要再次引用相同的对象
像这样更改您的代码:
private void cancelAlarm() {
alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent notifyIntent = new Intent(context, BatteryCheckingReciever.class);
p = PendingIntent.getBroadcast(context, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
if (alarmManager != null) {
Log.e("kiran", "canceling alarm");
alarmManager.cancel(p);
alarmManager = null;
}
}