У меня есть MainService, которая вызывает BroadcastReceiver для мониторинга состояния зарядки аккумулятора.
MainService:
public class MainService extends Service {
private static final String TAG = MainService.class.getName();
BroadcastReceiver broadcastReceiver = new BatteryChargingReceiver();
NotificationManagerCompat notificationManager;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG,"creating service");
registerReceiver(broadcastReceiver,new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}
@Override
public void onDestroy() {
Log.d(TAG,"destroying service");
//notificationManager.cancelAll();
unregisterReceiver(broadcastReceiver);
super.onDestroy();
}
public static void startIfEnabled(Context context) {
SharedPreferences preferences = context.getSharedPreferences(Constants.PREFERENCES_FILE_NAME, 0);
boolean isEnabled = preferences.getBoolean(Constants.PREFERENCES_KEY_ENABLED, false);
Intent intent = new Intent(context, MainService.class);
if (isEnabled) {
context.startService(intent);
} else {
context.stopService(intent);
}
}
BroadcastReceiver:
public void onReceive(Context context, Intent intent) {
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
sharedPreferences = context.getSharedPreferences(Constants.PREFERENCES_FILE_NAME,0);
isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
boolean isEnabled = sharedPreferences.getBoolean(Constants.PREFERENCES_KEY_ENABLED,false);
Intent notifintent = new Intent(context,MainActivity.class);
notifintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notifintent, 0);
if(intent != null){
final String action = intent.getAction();
if(Intent.ACTION_BATTERY_CHANGED.equals(action)){
if(isCharging && isEnabled){
alreadyNotified = true;
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.baseline_battery_full_black_24)
.setContentTitle("Battery Assistant")
.setContentText("Battery Percentage : "+level+"%")
.setOnlyAlertOnce(false)
.setContentIntent(pendingIntent)
.setCategory(NotificationCompat.CATEGORY_ALARM)
.setProgress(Constants.PROGRESS_MAX,level,false)
.setOngoing(true)
.setPriority(NotificationCompat.PRIORITY_HIGH);
notificationManager=NotificationManagerCompat.from(context);
notificationManager.notify(Constants.notificationId,builder.build());
if(level==100){
// Do some stuff
}
}
else{
if(alreadyNotified){
alreadyNotified = false;
notificationManager.cancel(Constants.notificationId);
}
Mainservice запускает широковещательный приемник, который считывает состояние зарядки аккумулятора и уровень заряда аккумулятора.
Поэтому, когда телефон находится в состоянии зарядки, всплывающее уведомление. Если MainService останавливается в этом состоянии, уведомление остается там. Я хочу, чтобы его уволили, когда служба остановилась.
Я пытался вызвать messagesmanager.cancel (id) или messagesmanager.cancelAll () в MainService onDestroy метод, но он дает Роковое исключение.
Также важно вызвать построитель уведомлений в BroadcastReceiver, чтобы постоянно обновлять уведомление в соответствии с уровнем заряда батареи.
Так как этого добиться?