Метод широковещательного приемника onReceive не вызывается, когда экран/процессор отключается

Я работаю над приложением, которое будет уведомлять меня (играя мелодию звонка), что уровень заряда батареи достиг определенного уровня. Уровень настраивается. Для этого я создал действие, которое запускает службу, которая, в свою очередь, регистрирует получателя для ACTION_BATTERY_CHANGED.

MyActivity -> MyService -> MyBrodcastReceiver [ACTION_BATTERY_CHANGED] -> onReceive() -> if(Battery Level ‹= MyValue) -> воспроизвести рингтон

Все работает нормально, пока экран включен, но как только телефон заблокирован и экран гаснет или процессор спит, метод onReceive широковещательного приемника не вызывается, и когда я снова разблокирую телефон, все работает. Я проверил это с помощью регистрации.

Это метод onReceive для ACTION_BATTERY_CHANGED вызывается только тогда, когда экран телефона включен, и останавливается, когда телефон спит?

Я даже пытался использовать Wake Lock в методе onReceive, но это не сработало 

[Я тестирую с ICS (4.0.4)]

import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log;


public class BatteryMeterService extends Service {

    private BatteryStatusReceiver batteryStatusReceiver;

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

    @Override
    public void onCreate() {
        super.onCreate();
        IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        batteryStatusReceiver = new BatteryStatusReceiver(null); 
        registerReceiver(batteryStatusReceiver, intentFilter);      
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(batteryStatusReceiver);
    }

}


import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.BatteryManager;
import android.os.PowerManager;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.util.Log;
import android.widget.TextView;

import com.amol.bm.BatteryMeterUtility.NotificationInfo;

public class BatteryStatusReceiver extends BroadcastReceiver {


    private BatteryMeterUtility batteryMeterUtility;

    public BatteryStatusReceiver() {
        super();
    }

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


        int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
        int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
        float fPct = (level / (float)scale) * 100;
        int levelPct = (int)fPct; 

        boolean prefAlertLowBattery = sharedPrefs.getBoolean("prefAlertLowBattery", true);
        if(prefAlertLowBattery) {
                String prefAlertLowBatteryValue = sharedPrefs.getString("prefAlertLowBatteryValue", "20");
                int lowBatteryValue = Integer.parseInt(prefAlertLowBatteryValue);
                if(levelPct <= lowBatteryValue && iStatus != BatteryManager.BATTERY_STATUS_CHARGING) {
                notificationInfo.icon = R.drawable.low_battery;
                PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
                PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "BM WakeLook");
                wakeLock.acquire();
                batteryMeterUtility.playAlertRingtone(alertRingtone);
                wakeLock.release();
                }
        }
    }

}

person Amol Pophale    schedule 07.05.2013    source источник
comment
Вы можете определить разрешение для WAKE_LOCK в манифесте и проверить.   -  person user1721904    schedule 07.05.2013
comment
Вы отменяете регистрацию приемника где-нибудь в своем коде ?? Наверное в onPause??   -  person user1721904    schedule 07.05.2013
comment
Не в onPause, а в OnDestroy службы, но я проверил по журналу, что служба onDestroy не вызывается.   -  person Amol Pophale    schedule 07.05.2013
comment
Не могли бы вы попробовать зарегистрировать свой приемник в файле манифеста и проверить?   -  person user1721904    schedule 07.05.2013
comment
Вы не можете зарегистрировать ACTION_BATTERY_CHANGED в манифесте. Вы не можете получить это через компоненты, объявленные в манифестах, только явно зарегистрировавшись для этого с помощью Context.registerReceiver(). Ссылка: developer.android.com/reference/android/content/   -  person Amol Pophale    schedule 07.05.2013
comment
С какой проблемой вы столкнулись после использования WAKE_LOCK?   -  person user1721904    schedule 07.05.2013
comment
Моя проблема в том, что метод OnReceive не вызывается, когда экран выключен, даже после использования WAKE_LOCK   -  person Amol Pophale    schedule 07.05.2013
comment
Где вы запускаете и останавливаете службу?   -  person user1721904    schedule 08.05.2013
comment
Я запускаю службу onDestroy моей активности и останавливаю ее onCreate. Поскольку я хочу, чтобы он работал только в фоновом режиме и не хотел работать, когда моя активность запущена.   -  person Amol Pophale    schedule 08.05.2013


Ответы (2)


Вы должны дать WAKE_LOCK Разрешение вашей службе, работающей в фоновом режиме, чтобы даже когда телефон простаивает или отключается, ваша служба продолжала работать. надеюсь, вы поняли, дайте мне знать, если неясно

person M.Tahir Ashraf    schedule 07.05.2013
comment
Я не понял, что вы имеете в виду под разрешением на обслуживание. Я добавил разрешение пользователя для WAKE_LOCK в файле манифеста. Также я ДУМАЮ, что моя служба работает, даже когда экран выключен. - person Amol Pophale; 07.05.2013
comment
можете ли вы показать свой код, т.е. сервис и вещательный приемник - person M.Tahir Ashraf; 07.05.2013
comment
Конечно. Но в настоящее время я вне. Выложу код, как только буду дома. Но чтобы дать вам представление: в методе службы onCreate() я регистрирую прослушиватель вещания, а в onDestroy отменяю его регистрацию. В широковещательном приемнике в методе onReceive я проверяю уровень заряда батареи и играю рингтон с помощью медиаплеера. В любом случае выложу код. - person Amol Pophale; 07.05.2013

Наконец, я использовал Alarm Manager с RTC_WAKEUP для решения этой проблемы. http://developer.android.com/reference/android/app/AlarmManager.html

person Amol Pophale    schedule 09.05.2013