1

私は待っている受信機を持っていますTelephonyManager.ACTION_PHONE_STATE_CHANGED:

public void onReceive(Context context, Intent intent) {
String theAction = intent.getAction();  
if (theAction != null && theAction.equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) {
        CONTEXT = context;
        startListening();   
}

取得したら、リスナーを登録します (方向センサー用)。

public void startListening() {  
    sensorManager = (SensorManager) CONTEXT.getSystemService(Context.SENSOR_SERVICE);
    List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
    if (sensors.size() > 0) {
        sensor = sensors.get(0);
        running = sensorManager.registerListener(sensorEventListener, sensor, SensorManager.SENSOR_DELAY_FASTEST);
    }
}   

そして、リスナーのonSensorChanged()メソッドで:

public void onSensorChanged(SensorEvent event) {
    if(running) {   
        sensorManager.unregisterListener(this);
        // do some not significant stuff here
    }

そして今問題: 電話がかかってきて、受信機が起動し、次にリスナーが起動し、すべてが設計どおりに機能します。しかし、後でバッテリー統計を見ると、私のアプリは 2 ~ 3% の消耗があるアプリとしてリストされています。この割合は、通話がないにもかかわらず増加しています。したがって、受信機は機能していません

このバッテリーの消耗はどこから来るのですか?レシーバーを開始するアクティビティが機能していません (とにかく単一のチェックボックスです)。私は、リスナーがによって登録解除されない可能性があると思いますsensorManager.unregisterListener(this);が、うまくいくはずです-最初のイベントを受け取ったときにリスナーを登録解除します。それは理にかなっています。

どうすれば問題を解決できますか?

4

1 に答える 1

5

このバッテリーの消耗はどこから来るのですか?

BroadcastReceiver. _ onReceive()_ SensorListenerIOW、 manifest-registered から a を安全に登録することはできませんBroadcastReceiver

を登録する場所で、 (経由で) にBroadcastReceiver委任作業を行ってください。センサーの読み取り値を取得したとき、またはタイムアウトの後 (ヒント: 電話の向きが常に変わるとは限りません)、または(Android がサービスをシャットダウンすることを決定した場合)、リスナーの登録を解除し、サービスをシャットダウンするために呼び出します。ServicestartService()onStartCommand()SensorListeneronDestroy()stopSelf()

于 2011-07-30T17:41:38.077 に答える