Android PhoneStateListener: onCellLocationChanged в режиме ожидания - PullRequest
4 голосов
/ 20 апреля 2011

Я пишу приложение, которое работает в фоновом режиме в качестве службы переднего плана.Этот сервис создает экземпляр подкласса PhoneStateListener.PhoneStateListener создает TelephonyService с объектом контекста службы переднего плана, а затем прослушивает изменения местоположения ячейки.Это прекрасно работает, когда дисплей включен.Но как только дисплей отключается, регистрация ячеек больше не работает.

public class gps_service extends Service
{
public static TelephonyManager p_TelephonyManager = null;
public static myPhoneStateListener p_myPhoneStateListener = null;

@Override
  public int onStartCommand(Intent intent, int flags, int startId) 
  {
  p_myPhoneStateListener = new myPhoneStateListener();
  p_TelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
  p_TelephonyManager.listen(p_myPhoneStateListener, PhoneStateListener.LISTEN_CELL_LOCATION);
...

}

public class myPhoneStateListener extends PhoneStateListener
{
    public static int CurrentCellID;
    /*
    public static int current_cell_id;  
    @Override
    public void onCellLocationChanged(CellLocation p_CellLocation)
    {
       //write to log
    }

}

<uses-sdk android:minSdkVersion="3" />    
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

КогдаЭкран телефона включен, все работает нормально, но при включении экрана события onCellLocationChanged никогда не вызывать.Также я пытаюсь GsmCellLocation currentCellLocation = (GsmCellLocation) p_TelephonyManager .getCellLocation (); по этому коду всегда возвращать идентификатор последней ячейки перед выключенным экраном, а не фактический идентификатор ячейки.

Также я пытаюсь частично в моемсервис, но результат тот же:

private PowerManager pPowerManager = null;
private PowerManager.WakeLock pWakeLock = null;
..

@Override
public void onCreate() 
{
    super.onCreate();
    pPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    pWakeLock = pPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "No sleep");
    pWakeLock.acquire();
...
}

@Override
public void onDestroy() 
{
    if (pWakeLock != null)
        {
            pWakeLock.release();
            pWakeLock = null;
        }
...
}

Есть идеи, что я делаю не так?Тестирование на HTC Desire Z Android 2.2

1 Ответ

0 голосов
/ 20 апреля 2011

Эта ситуация отключена, поэтому телефон переходит в спящий режим.Взгляните на PowerManager .

Определены следующие флаги, которые по-разному влияют на мощность системы.Эти флаги являются взаимоисключающими - вы можете указать только один из них.

Flag Value            CPU   Screen  Keyboard
PARTIAL_WAKE_LOCK      On*  Off      Off
SCREEN_DIM_WAKE_LOCK    On  Dim     Off
SCREEN_BRIGHT_WAKE_LOCK On  Bright  Off
FULL_WAKE_LOCK          On  Bright  Bright

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

 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
 PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
 wl.acquire();
   ..screen will stay on during this section..
 wl.release();
...