Android PhoneStateListener:在待机模式下onCellLocationChanged

问题描述

| 我正在编写一个后台作为前台服务运行的应用程序。该服务实例化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上进行测试

解决方法

这种情况被屏蔽掉了,因此电话进入了睡眠模式。 看一下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();

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...