Как определить, заряжается ли устройство от фона - PullRequest
0 голосов
/ 29 февраля 2020

Я искал в заметках для разработчиков по android и не могу выяснить, как выполнить указанное c действие, когда устройство подключено, и выполнить другое действие, когда оно отключено.

Я попытался установить широковещательный приемник, как показано ниже, однако он не будет работать:

    <receiver android:name=".PowerConnectionReceiver">
        <intent-filter>
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
        </intent-filter>
    </receiver>

Я понимаю, что начиная с API 26 и выше вы больше не можете получать некоторые трансляции, зарегистрированные в манифесте, и должны зарегистрируйте их динамически.

Мне нужно выполнить этот прогон в фоновом режиме, но не могу понять, как? Эта статья, обновленная в 2019 году (после API 26), подразумевает, что я должен быть в состоянии это сделать.

Состояние зарядки может изменяться так же легко, как и устройство, которое можно подключить, поэтому важно следить за изменяйте состояние зарядки и соответственно изменяйте свой показатель refre sh.

BatteryManager передает действие, когда устройство подключено или отключено от источника питания. Эти события важно получать даже тогда, когда ваше приложение не работает, особенно потому, что эти события должны влиять на частоту запуска вашего приложения, чтобы инициировать фоновое обновление, поэтому вы должны зарегистрировать BroadcastReceiver в своем манифесте, чтобы прослушивать оба события. определив ACTION_POWER_CONNECTED и ACTION_POWER_DISCONNECTED в фильтре намерений.

Моя конечная цель - вызывать приемник вещания всякий раз, когда устройство подключено или отключено.

Как бы я go о реализации этого?

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

Лучший способ сделать это sh - это запустить службу в фоновом режиме, чтобы вы могли получать широковещательную рассылку от android без использования приложения пользователем.

Начните с регистрации службы в файле манифеста.

<Service android:name=".serviceName"/>

Теперь создайте свой класс с тем же именем, которое зарегистрировано в манифесте выше, этот класс должен расширять Service.

    public class BackgroundService extends Service {
        private static final int NOTIF_ID = 1;
        private static final String NOTIF_CHANNEL_ID = "AppNameBackgroundService";

        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }

        @Override
        public int onStartCommand(Intent intent, int flags, int startId){

            //Add broadcast receiver for plugging in and out here
            ChargeDetection chargeDetector = new ChargeDetection(); //This is the name of the class at the bottom of this code.

            IntentFilter filter = new IntentFilter();
            filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
            filter.addAction(Intent.ACTION_POWER_CONNECTED);
            filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
            this.registerReceiver(chargeDetector, filter);

            startForeground();

            return super.onStartCommand(intent, flags, startId);
        }

        private void startForeground() {
            createNotificationChannel();
            Intent notificationIntent = new Intent(this, MainActivity.class);

            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                    notificationIntent, 0);

            startForeground(NOTIF_ID, new NotificationCompat.Builder(this,
                    NOTIF_CHANNEL_ID) // don't forget create a notification channel first
                    .setOngoing(true)
                    .setSmallIcon(R.mipmap.final_icon)
                    .setContentTitle(getString(R.string.app_name))
                    .setContentText("Background service is running")
                    .setContentIntent(pendingIntent)
                    .build());
        }

        private void createNotificationChannel() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel serviceChannel = new NotificationChannel(
                        NOTIF_CHANNEL_ID,
                        "Foreground Service Channel",
                        NotificationManager.IMPORTANCE_DEFAULT
                );
                NotificationManager manager = getSystemService(NotificationManager.class);
                manager.createNotificationChannel(serviceChannel);
            }
        }
    }

    class ChargeDetection extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            //Now check if user is charging here. This will only run when device is either plugged in or unplugged.
        }
    }   
    }
0 голосов
/ 29 февраля 2020

Вам необходимо зарегистрировать этот приемник с кодом

Вы можете запустить WorkManager для запуска каждые 15 минут (минимум каждые 15 минут), зарегистрировать приемник, проверить, заряжается ли он, отменить регистрацию приемника

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...