(Отменить регистрацию широковещательного приемника программно?

avatar
Leo Letto
1 июля 2021 в 19:04
41
1
0

Я разрабатываю плагин Flutter, который дает пользователю возможность прослушивать состояние телефона, даже когда приложение находится в фоновом режиме/закрыто. Проблема здесь в том, что я хочу иметь возможность включать/отключать эту службу программно, сейчас у меня на моем AndroidManifest.xml следующее receiver:

<receiver android:name=".CallerPhoneServiceReceiver">
   <intent-filter>
      <action android:name="android.intent.action.PHONE_STATE" />
   </intent-filter>
</receiver>

И это работает отлично, мой код dart вызывается в фоновом режиме без проблем, теперь я хочу отключить этот receiver всякий раз, когда пользователь решает, что он больше не хочет прослушивать эти события, погуглив немного я нашел registerReceiver и unregisterReceiver, которые, по-видимому, делают то, что мне нужно, но похоже, что unregisterReceiver работает только тогда, когда вызов с тем же объектом был передан registerReceiver в качестве аргумента, в основном он работает до тех пор, пока приложение остается открытым, но как я могу отменить регистрацию, если пользователь решит закрыть приложение и вернуться, чтобы деактивировать события? Даже когда пользователь деактивируется сам по себе, я хочу иметь возможность вызывать этот метод в случае выхода из системы.

Я видел несколько примеров, в которых говорится, что нужно использовать sharedPreferences и сохранить, является ли служба ON/OFF, а затем решить, вызывать или нет код dart, но моя служба все равно останется активной, ничего не делая, кроме активной , и это может потреблять заряд батареи, это не очень хорошее решение, что мне делать?

Источник

Ответы (1)

avatar
Nikhil Jain
1 июля 2021 в 19:12
1

Вы можете использовать PackageManager для включения или отключения BroadcastReceiver, определенного в файле AndroidManifest. См. приведенный ниже код:

ComponentName receiver = new ComponentName(context, CallerPhoneServiceReceiver.class);
PackageManager pm = context.getPackageManager();

pm.setComponentEnabledSetting(receiver, 
    PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
    PackageManager.DONT_KILL_APP);

Вы можете использовать PackageManager.COMPONENT_ENABLED_STATE_DISABLED для отключения компонента и PackageManager.COMPONENT_ENABLED_STATE_ENABLED для включения компонента.