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 でのテスト

4

1 に答える 1

0

この状況は画面がオフになっているため、電話はスリープモードになります。PowerManagerを調べてください。

次のフラグが定義されており、システムの電源にさまざまな影響を与えます。これらのフラグは相互に排他的です。指定できるのは 1 つだけです。

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();
于 2011-04-20T07:33:48.137 に答える