0

シェイク イベントが検出されたときにアプリケーションのアクティビティを起動したいと考えています。私はこれが私のアプリケーションの外で起こることを望みます。

SensorEventListenerを正しく実装する方法など、多くの優れたコード スニペットがここここにありますが、リスナーの登録を解除しなくても、リスナーは破棄されます。

破棄されないようにして「永続的な」リスナーを登録するにはどうすればよいですか? そのような例はどこにも見つかりません...リンクやガイダンスは本当にありがたいです。

最後に、ディスプレイがオンのときにそのようなイベントのみをリッスンするにはどうすればよいですか? とにかく、これはハードウェアの制限である可能性があることを理解しています。

前もって感謝します。

4

1 に答える 1

1

BOOT_COMPLETED インテントのブロードキャスト レシーバーを登録し、onReceive でPARTIAL_WAKELOCK使用してバックグラウンド サービスを開始し、センサー イベント リスナーを登録します。このようなもの:

@Override
public int onStartCommand(Intent i, int flags, int startId) {
    acquireWakeLock();
    registerSensorListener();
    return START_STICKY;
}

@Override
public void onDestroy() {
    unregisterSensorListener();
    releaseWakeLock();
    super.onDestroy();
}

private void acquireWakeLock() {
    try {
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        if (pm == null) {
            Log.e(TAG, "Power manager not found!");
            return;
        }
        if (wakeLock == null) {
            wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getPackageName());
            if (wakeLock == null) {
                Log.e(TAG, "Could not create wake lock (null).");
                return;
            }
        }
        if (!wakeLock.isHeld()) {
            wakeLock.acquire();
            if (!wakeLock.isHeld()) {
                Log.e(TAG, "Could not acquire wake lock.");
            }
        }
    } catch (RuntimeException e) {
        Log.e(TAG, "Caught unexpected exception: " + e.getMessage(), e);
    }
}

private void releaseWakeLock() {
    if (wakeLock != null && wakeLock.isHeld()) {
        wakeLock.release();
        wakeLock = null;
    }
}

お役に立てれば。

于 2012-06-16T17:58:07.857 に答える