Androidでデバイスの画面のロックが解除されたときにサービスを開始する

サラ・カルテンツ

画面のロックが解除されたらサービスを実行し、画面がロックされたらサービスを停止したいと思います。私はこれらの答えを調べて実装しました。ただし、画面をロックすると必要に応じてサービスが停止しますが、画面のロックを解除してもサービスは再開されません。

このサービスを実行するためのコードは次のとおりです。

public class PhonePositionService extends Service {
@Override
    public void onCreate() {
    //ADDED CODE
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    BroadcastReceiver mReceiver = new BootCompletedIntentReceiver();
    registerReceiver(mReceiver, filter);
    {...}
    }
@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    int icon = R.drawable.ic_stat_bright;
    startForeground(NOTIFICATION_ID, getCompatNotification(icon));
    if (backgroundThread != null) {
      backgroundThread.start();
    }
    return START_STICKY;
  }
}

他のファイルでは、私の放送受信機コードは次のとおりです。

public class BootCompletedIntentReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {
   String action = intent.getAction();
   if(Intent.ACTION_SCREEN_ON.equals(action)) {
     // start the service
     Intent pushIntent = new Intent(context, PhonePositionService.class);
     context.startService(pushIntent);
   } else if(Intent.ACTION_SCREEN_OFF.equals(action)) {
     // stop the service
     Intent pushIntent = new Intent(context, PhonePositionService.class);
     context.stopService(pushIntent);
   }
  if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
    Intent pushIntent = new Intent(context, PhonePositionService.class);
    context.startService(pushIntent);
  }
 }
}

それでは、電話のロックを解除したときにサービスが再開されないのはなぜですか?

サーガル

まず第一に、管理者権限を取得するまで、ユーザーが電話のロックを解除したかどうかを検出することはできません。あなたが直面している問題は、画面がオフのときPhonePositionService使用を停止しいるためですstopService()

public class BootCompletedIntentReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {
   String action = intent.getAction();
   if(Intent.ACTION_SCREEN_ON.equals(action)) {
     // start the service
     Intent pushIntent = new Intent(context, PhonePositionService.class);
     context.startService(pushIntent);
   } else if(Intent.ACTION_SCREEN_OFF.equals(action)) {
     // stop the service
     Intent pushIntent = new Intent(context, PhonePositionService.class);
     //This will stop the service
     context.stopService(pushIntent);
   }
  if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
    Intent pushIntent = new Intent(context, PhonePositionService.class);
    context.startService(pushIntent);
  }
 }
}

BroadcastReceiverは登録解除されていないため、メモリリークが発生する可能性があります。

(高速の)バッテリーの消耗につながる可能性があるため、サービスをフォアグラウンドで永久に実行し続けることはお勧めしません。

他の選択肢を見つけることをお勧めします。ただし、コア機能が影響を受けていても続行したい場合は、次の回避策を実行できます。

BootCompletedIntentReceiver内部クラスとして作成しPhonePositionServiceます。また、サービスを開始および停止する代わりに、アクションを直接実行します。

public class PhonePositionService extends Service {
   @Override
   public void onCreate() {
       //ADDED CODE
       IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
       filter.addAction(Intent.ACTION_SCREEN_OFF);
       BroadcastReceiver mReceiver = new BootCompletedIntentReceiver();
       registerReceiver(mReceiver, filter);
       ...
    }
    ...
    private class BootCompletedIntentReceiver extends BroadcastReceiver {
       @Override
       public void onReceive(Context context, Intent intent) {
         String action = intent.getAction();
         if(Intent.ACTION_SCREEN_ON.equals(action)) {
          //DO action for SCREEN_ON
         } else if(Intent.ACTION_SCREEN_OFF.equals(action)) {
          //Do action for SCREEN_OFF
         }

       }
   }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

デバイスがリセットされたときにサービスを開始する

分類Dev

不明な例外:画面がロックされた後にデバイスのロックが解除されると、SIGPIPEにクラッシュを通知します

分類Dev

フックが新しいスレッドを開始するときに、フックされたプロセスのフックを解除する

分類Dev

デバイス(電話)が検出されたときにウィンドウのロックを解除することはできますか?

分類Dev

Androidデバイス画面のロックを解除するためのADBキーイベント82がKKデバイスで機能していません

分類Dev

アプリのアップデートをテストするときに、Androidリリースビルドで署名されたAPKのインストールがサイレントにブロックされました

分類Dev

アプリのアップデートをテストするときに、Androidリリースビルドで署名されたAPKのインストールがサイレントにブロックされました

分類Dev

別のサービスがリロードされたときに開始するようにsystemdサービスを構成する

分類Dev

Jenkinsがサービスを開始できないのに、手動で開始すると正常に開始されるのはなぜですか?

分類Dev

react-native-androidでデバイスのロックを解除した後、向きが更新されない

分類Dev

Windows サービスのデバッグ - サービスを開始できないようにする

分類Dev

ページの1つに含まれるUISwitchでタッチが開始されたときに、UIPageViewControllerのスクロールを無効にします

分類Dev

アクティビティの開始時ではなく、ユーザーがテキストビューをクリックしたときにACTIVITY_CALLが開始されるようにするにはどうすればよいですか?

分類Dev

デバイスのロックが解除されようとしているときに呼び出されるメソッドはどれですか?

分類Dev

Android:画面がロックされているときにアクティビティを開始する方法

分類Dev

イオンAndroidのビルドに失敗しました:デーモン・プロセスを開始することができません。

分類Dev

Android 8.1バージョンのデバイスでアクティビティが終了したときに画面の向きが変更されないようにするにはどうすればよいですか?

分類Dev

画面を開始するときに、どのようにイントロメッセージをバイパスまたはスキップしますか?

分類Dev

インテントサービスが終了するのを待つ方法-インテントサービスがAsyncTaskから開始されたとき

分類Dev

Android:画面がロックされているときにサービスを実行するにはどうすればよいですか?

分類Dev

onPause()で開始されたフォアグラウンドサービスからアクティビティのバインドを解除する必要がありますか?

分類Dev

他のサービスが完了したときにのみサービスを開始するにはどうすればよいですか?

分類Dev

カスタムOSのAndroidデバイスで終わることのないバックグラウンドサービスを開始するためのベストプラクティス

分類Dev

Google AppEngine-新しくデプロイされたサービスバージョンの自動開始を無効にする

分類Dev

スプリングブートマイクロサービスが開始されたときに、Liquibaseがpostgresにテーブルを作成しないのはなぜですか?

分類Dev

Android-サービスを開始する前にスレッドが実行されるのを待つ

分類Dev

ロック画面でサービスからアクティビティを開始すると、画面はオンになりますが、アクティビティ自体は表示されません

分類Dev

アプリケーションが破棄されたときにサービスのバインドを解除する方法

分類Dev

Androidアプリの向きが横向きにロックされ、デバイスがロックされ、横向きに回転してロックが解除され、アプリケーションがクラッシュする

Related 関連記事

  1. 1

    デバイスがリセットされたときにサービスを開始する

  2. 2

    不明な例外:画面がロックされた後にデバイスのロックが解除されると、SIGPIPEにクラッシュを通知します

  3. 3

    フックが新しいスレッドを開始するときに、フックされたプロセスのフックを解除する

  4. 4

    デバイス(電話)が検出されたときにウィンドウのロックを解除することはできますか?

  5. 5

    Androidデバイス画面のロックを解除するためのADBキーイベント82がKKデバイスで機能していません

  6. 6

    アプリのアップデートをテストするときに、Androidリリースビルドで署名されたAPKのインストールがサイレントにブロックされました

  7. 7

    アプリのアップデートをテストするときに、Androidリリースビルドで署名されたAPKのインストールがサイレントにブロックされました

  8. 8

    別のサービスがリロードされたときに開始するようにsystemdサービスを構成する

  9. 9

    Jenkinsがサービスを開始できないのに、手動で開始すると正常に開始されるのはなぜですか?

  10. 10

    react-native-androidでデバイスのロックを解除した後、向きが更新されない

  11. 11

    Windows サービスのデバッグ - サービスを開始できないようにする

  12. 12

    ページの1つに含まれるUISwitchでタッチが開始されたときに、UIPageViewControllerのスクロールを無効にします

  13. 13

    アクティビティの開始時ではなく、ユーザーがテキストビューをクリックしたときにACTIVITY_CALLが開始されるようにするにはどうすればよいですか?

  14. 14

    デバイスのロックが解除されようとしているときに呼び出されるメソッドはどれですか?

  15. 15

    Android:画面がロックされているときにアクティビティを開始する方法

  16. 16

    イオンAndroidのビルドに失敗しました:デーモン・プロセスを開始することができません。

  17. 17

    Android 8.1バージョンのデバイスでアクティビティが終了したときに画面の向きが変更されないようにするにはどうすればよいですか?

  18. 18

    画面を開始するときに、どのようにイントロメッセージをバイパスまたはスキップしますか?

  19. 19

    インテントサービスが終了するのを待つ方法-インテントサービスがAsyncTaskから開始されたとき

  20. 20

    Android:画面がロックされているときにサービスを実行するにはどうすればよいですか?

  21. 21

    onPause()で開始されたフォアグラウンドサービスからアクティビティのバインドを解除する必要がありますか?

  22. 22

    他のサービスが完了したときにのみサービスを開始するにはどうすればよいですか?

  23. 23

    カスタムOSのAndroidデバイスで終わることのないバックグラウンドサービスを開始するためのベストプラクティス

  24. 24

    Google AppEngine-新しくデプロイされたサービスバージョンの自動開始を無効にする

  25. 25

    スプリングブートマイクロサービスが開始されたときに、Liquibaseがpostgresにテーブルを作成しないのはなぜですか?

  26. 26

    Android-サービスを開始する前にスレッドが実行されるのを待つ

  27. 27

    ロック画面でサービスからアクティビティを開始すると、画面はオンになりますが、アクティビティ自体は表示されません

  28. 28

    アプリケーションが破棄されたときにサービスのバインドを解除する方法

  29. 29

    Androidアプリの向きが横向きにロックされ、デバイスがロックされ、横向きに回転してロックが解除され、アプリケーションがクラッシュする

ホットタグ

アーカイブ