web-dev-qa-db-ja.com

画面がオフ/ロックされていると、電話の振動が動作を停止します

私は私のウェブサイト上のアップデートをチェックするサービスを持っています、そして、画面がオフまたはロックされていても更新が見つかったときに振動を引き起こすことができたいと思います。

振動は現在画面がオフ/ロックされていない場合にのみ機能します。画面がオフ/ロックされていても、他のすべての機能が機能します。

Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
   long[] pattern = new long[]{0, 400, 200, 400};
   if (Build.VERSION.SDK_INT >= 26) { // New API
     vibrator.vibrate(VibrationEffect.createWaveform(pattern,0));
   } else { // Old API
     vibrator.vibrate(pattern, 0);
}
 _

画面がオフの場合でも電話機を振動させるにはどうすればいいですか?私はWakeLockを使おうとしましたが、それは問題ないようですか?

画面がオンのときにその機能として、すべての権限が設定されています。

10
Persson

画面ロジックのオン/オフを制御するための受信側を追加することを試みることができます。

public class ScreenReceiver extends BroadcastReceiver {

    public static boolean wasScreenOn = true;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            // DO WHATEVER YOU NEED TO DO HERE
            Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
            long[] pattern = new long[]{0, 400, 200, 400};
            // Only perform this pattern one time (-1 means "do not repeat")
            v.vibrate(pattern, -1);
            wasScreenOn = false;
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            // AND DO WHATEVER YOU NEED TO DO HERE
            wasScreenOn = true;
        }
    }

}

public class ExampleActivity extends Activity {

   @Override
    protected void onCreate() {
        // INITIALIZE RECEIVER
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        BroadcastReceiver mReceiver = new ScreenReceiver();
        registerReceiver(mReceiver, filter);
        // YOUR CODE
    }

    @Override
    protected void onPause() {
        // WHEN THE SCREEN IS ABOUT TO TURN OFF
        if (ScreenReceiver.wasScreenOn) {
            // THIS IS THE CASE WHEN ONPAUSE() IS CALLED BY THE SYSTEM DUE TO A SCREEN STATE CHANGE
            System.out.println("SCREEN TURNED OFF");
        } else {
            // THIS IS WHEN ONPAUSE() IS CALLED WHEN THE SCREEN STATE HAS NOT CHANGED
        }
        super.onPause();
    }

    @Override
    protected void onResume() {
        // ONLY WHEN SCREEN TURNS ON
        if (!ScreenReceiver.wasScreenOn) {
            // THIS IS WHEN ONRESUME() IS CALLED DUE TO A SCREEN STATE CHANGE
            System.out.println("SCREEN TURNED ON");
        } else {
            // THIS IS WHEN ONRESUME() IS CALLED WHEN THE SCREEN STATE HAS NOT CHANGED
        }
        super.onResume();
    }

}
 _

これがアクティビティライフサイクルです: Activity Lifecycle

リファレンス:

https://thinkandroid.wordpress.com/2010/01/24/handling-screen-off-and-screen-on-intents/

1

あなたの説明から

私は私のウェブサイト上のアップデートをチェックするサービスを持っています

あなたはいくつかの頻度であなたのウェブサイトへの更新をチェックします。アプリケーションがインターネットに接続できなくなるため、アプリケーションがサーバーに接続する前に、サーバーに接続する前にWake Lockを取得することを確認してください。

また、通知を表示するか、次のように画面をオンにすることもできます この回答 画面がオフになっているときにウェイクロックを取得できない場合は( - === - )。

アップデートを検出した後にウェイクロックを取得しようとしている可能性があるため、問題が発生する可能性があると思います。

0
mayank1513