#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;
}
}