Android手机状态监听器:待机模式下的onCellLocationChanged

4

我正在编写一个在后台作为前台服务运行的应用程序。此服务实例化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();

但是这段代码总是返回屏幕关闭前的上一个小区ID,而不是实际的小区ID。

我还在我的服务中尝试使用partial_wake_lock,但结果相同:

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

这种情况是屏幕关闭,因此手机进入睡眠模式。 请查看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

*如果您持有部分唤醒锁定,CPU将继续运行,无论任何计时器以及即使用户按下电源按钮。在所有其他唤醒锁定中,CPU将运行,但用户仍然可以使用电源按钮将设备置于睡眠状态。

 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();

PowerManager已经在我的服务中使用(更新1篇文章)。PARTIAL_WAKE_LOCK不够用吗? - Sergey UKR
你使用过LocationManager.requestLocationUpdates方法吗?链接 - bluekyg
是的,LocationManager.requestLocationUpdates在使用时:GPS_PROVIDER在屏幕关闭时运作良好,但NETWORK_PROVIDER-在屏幕关闭时不更新位置(始终在onLocationChanged事件中返回相同的位置):( - Sergey UKR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接