Android: подсчет помощи при выключении / включении экрана в фоновой службе

#java #android #android-intent #android-service #intentfilter

#java #Android #android-намерение #android-сервис #intentfilter

Вопрос:

Для небольшого приложения, над которым я работаю, мне нужно подсчитать, сколько раз экран выключается и включается, и когда он это делает. Я создал BroadcastReceiver, который запускает службу после загрузки, которая должна это учитывать.

Это мой класс обслуживания:

 public class MyService extends Service {

  private final IBinder mBinder = new MyBinder();
  public static boolean wasScreenOn = true;

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    //the next line is line 29
      if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
        Log.i("Screen off", String.valueOf(System.currentTimeMillis()));
            wasScreenOn = false;
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            Log.i("Screen on", String.valueOf(System.currentTimeMillis()));
            wasScreenOn = true;
        }
      return Service.START_NOT_STICKY;
  }

  @Override
  public IBinder onBind(Intent arg0) {
  //TODO for communication return IBinder implementation
        return mBinder;
  }

  public class MyBinder extends Binder {
        MyService getService() {
          return MyService.this;
        }
      }
 

}

Проблема в том, что я получаю эту ошибку:

 06-26 23:16:38.485: E/AndroidRuntime(1402): FATAL EXCEPTION: main
06-26 23:16:38.485: E/AndroidRuntime(1402): java.lang.RuntimeException: Unable to start service com.MyApp.MyService@40ce0078 with Intent { cmp=com.MyApp/.MyService (has extras) }: java.lang.NullPointerException
06-26 23:16:38.485: E/AndroidRuntime(1402):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2673)
06-26 23:16:38.485: E/AndroidRuntime(1402):     at android.app.ActivityThread.access$1900(ActivityThread.java:141)
06-26 23:16:38.485: E/AndroidRuntime(1402):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1331)
06-26 23:16:38.485: E/AndroidRuntime(1402):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-26 23:16:38.485: E/AndroidRuntime(1402):     at android.os.Looper.loop(Looper.java:137)
06-26 23:16:38.485: E/AndroidRuntime(1402):     at android.app.ActivityThread.main(ActivityThread.java:5041)
06-26 23:16:38.485: E/AndroidRuntime(1402):     at java.lang.reflect.Method.invokeNative(Native Method)
06-26 23:16:38.485: E/AndroidRuntime(1402):     at java.lang.reflect.Method.invoke(Method.java:511)
06-26 23:16:38.485: E/AndroidRuntime(1402):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-26 23:16:38.485: E/AndroidRuntime(1402):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-26 23:16:38.485: E/AndroidRuntime(1402):     at dalvik.system.NativeStart.main(Native Method)
06-26 23:16:38.485: E/AndroidRuntime(1402): Caused by: java.lang.NullPointerException
06-26 23:16:38.485: E/AndroidRuntime(1402):     at com.MyApp.MyService.onStartCommand(MyService.java:29)
06-26 23:16:38.485: E/AndroidRuntime(1402):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2656)
 

Я полагаю, это потому, что при запуске службы по-прежнему нет намерения включать / выключать экран. Но я хочу, чтобы эта служба работала в фоновом режиме и ждала ее.

Как мне это сделать?

Большое спасибо!

Ответ №1:

Ваша проблема NullPointerException в onStartCommand . Это intent null .

Из документации:

намерение Намерение, переданное в startService (намерение), как указано. Это может быть нулевым, если служба перезапускается после завершения ее процесса, и ранее она возвращала что-либо, кроме START_STICKY_COMPATIBILITY .

Вы должны проверить null значение, прежде чем что-либо делать с intent .

Комментарии:

1. Я пробовал это: if(intent.getExtras()!=null){ if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { Log.i("Screen off", String.valueOf(System.currentTimeMillis())); wasScreenOn = false; } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { Log.i("Screen on", String.valueOf(System.currentTimeMillis())); wasScreenOn = true; }} но это все равно не сработало.

Ответ №2:

Я заставил это работать после того, как использовал код из этого приложения

Код:

 public class HardwareTriggerService extends Service {
private HardwareTriggerReceiver hardwareTriggerReceiver;
@Override
public void onCreate() {
    super.onCreate();
    Log.e(">>>>>>", "HardwareTriggerService CREATED.");
    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    hardwareTriggerReceiver = new HardwareTriggerReceiver();
    registerReceiver(hardwareTriggerReceiver, filter);
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.e(">>>>>>", "HardwareTriggerService DESTROYED.");
    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);

    unregisterReceiver(hardwareTriggerReceiver);
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}
}