Отменить регистрацию BroadcastReceiver в IntentService - PullRequest
0 голосов
/ 22 декабря 2011

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

Я начал с создания класса, расширяющего AppWidgetProvider.Я использую SharedPreferences для хранения состояния кнопки виджета.В методе OnReceive (Context, Intent) я использую намерение запустить IntentService, который регистрирует BroadcastReceiver для прослушивания изменений состояния телефона.Тем не менее, я не могу понять, как отменить регистрацию BroadcastReceiver, когда виджет отключен - мой код продолжает отслеживать состояние телефона, независимо от состояния кнопки виджета.Является ли это возможным?Или есть другой способ, которым я могу остановить PhoneStateListener?

Спасибо.

ОБНОВЛЕНИЕ : Вот изменения к коду

Манифест: я поместил BroadcastReceiver с фильтром намерений android.intent.action.PHONE_STATE в манифест

В AppWidgetProvider:

ComponentName componentName = new ComponentName(context, PhoneStateBroadcastReceiver.class);

//use to enable the broadcast receiver
packageManager.setComponentEnabledSetting(componentName, 
                        PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

//use to disable the broadcast receiver
packageManager.setComponentEnabledSetting(componentName, 
                        PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

В BroadcastReceiver:

@Override
public void onReceive(Context context, Intent intent) {

    //check call state
    TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
    if(tm.getCallState()==TelephonyManager.CALL_STATE_RINGING){
        try{

            //wait 2 seconds then answer the call
            Thread.sleep(2000);
            Class c = Class.forName(tm.getClass().getName());
            Method m = c.getDeclaredMethod("getITelephony");
            m.setAccessible(true);
            ITelephony telephony = (ITelephony)m.invoke(tm);
            telephony.silenceRinger();
            telephony.answerRingingCall();

        } catch(Exception e){}
    }

}

Не нужен PhoneStateListener ...

Облом, который это не сработает на 2.3 +

1 Ответ

1 голос
/ 23 декабря 2011

Я использую намерение запустить IntentService, который регистрирует BroadcastReceiver для прослушивания изменений состояния телефона

Это не будет работать надежно, так как после выхода из IntentService вашпроцесс может прекратиться, и ваш BroadcastReceiver исчезнет.Пожалуйста, укажите состояние телефона BroadcastReceiver в своем манифесте.

Однако я не могу понять, как отменить регистрацию BroadcastReceiver, когда виджет отключен

Используйте PackageManager и setComponentEnabledSetting(), чтобы включить или отключить приемник состояния телефона, который вы помещаете в манифест.

Кроме того, вы не можете надежно делать что-либо с BroadcastReceiver, который живет после onReceive(), напримеркак зарегистрировать прослушиватель событий, как вы делаете здесь.

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