Очистить уведомление о прекращении обслуживания - PullRequest
0 голосов
/ 03 июля 2018

У меня есть 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, чтобы постоянно обновлять уведомление в соответствии с уровнем заряда батареи.

Так как этого добиться?

...