我想在服务中每 5 分钟检查一次实际时间,并根据时间将手机静音或取消静音。早些时候我尝试在最后使用带有 thread.sleep(300000) 的 while(true),但它总是因 ANR 而崩溃,所以我尝试使用计时器任务,但现在它在行后立即崩溃AudioManager audioManager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
并出现 NullPointerException
package de.nathan.android.droidschool;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.os.IBinder;
import java.io.File;
import java.util.GregorianCalendar;
import java.util.Timer;
import java.util.TimerTask;
/**
* Created by nathan on 29.08.13.
*/
public class MuteService extends Service
{
Timer myTimer = new Timer();
MyTimerTask myTimerTask= new MyTimerTask();
AudioManager audioManager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
public void onCreate()
{
super.onCreate();
}
public int onStartCommand(Intent intent, int i1, int i2)
{
super.onStartCommand(intent, i1, i2);
myTimer.scheduleAtFixedRate(myTimerTask, 0, 600000); //(timertask,delay,period)
return START_STICKY;
}
public MuteService()
{
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private class MyTimerTask extends TimerTask {
@Override
public void run() {
GregorianCalendar cal = new GregorianCalendar();
String tag = null;
switch (cal.get(GregorianCalendar.DAY_OF_WEEK))
{
case GregorianCalendar.MONDAY:
tag = "Montag";
break;
case GregorianCalendar.TUESDAY:
tag = "Dienstag";
break;
case GregorianCalendar.WEDNESDAY:
tag = "Mittwoch";
break;
case GregorianCalendar.THURSDAY:
tag = "Donnerstag";
break;
case GregorianCalendar.FRIDAY:
tag = "Freitag";
break;
}
int i = 0;
while (i <= 10)
{
File f = new File("/sdcard/" + i + tag + "fach.txt");
if(!f.exists()) break;
i++;
}
i--;
int endHr = 0;
int endMin = 0;
switch (i)
{
case 0:
endHr = 8;
endMin = 30;
break;
case 1:
endHr = 9;
endMin = 20;
break;
case 2:
endHr = 10;
endMin = 20;
break;
case 3:
endHr = 11;
endMin = 10;
break;
case 4:
endHr = 12;
endMin = 5;
break;
case 5:
endHr = 12;
endMin = 55;
break;
case 6:
endHr = 13;
endMin = 55;
break;
case 7:
endHr = 14;
endMin = 45;
break;
case 8:
endHr = 15;
endMin = 35;
break;
case 9:
endHr = 16;
endMin = 25;
break;
case 10:
endHr = 17;
endMin = 15;
break;
}
if (cal.get(GregorianCalendar.HOUR_OF_DAY) < endHr)
{
audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
} else if (cal.get(GregorianCalendar.HOUR_OF_DAY) == endHr && cal.get(GregorianCalendar.MINUTE) <= endMin + 5)
{
audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
} else
{
int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);
if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE || audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT)
{
audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
audioManager.setStreamVolume(AudioManager.STREAM_RING, maxVolume, AudioManager.FLAG_SHOW_UI + AudioManager.FLAG_PLAY_SOUND);
}
}
}
}
}
日志猫:
08-30 12:44:04.508 23294-23294/de.nathan.android.droidschool D/AndroidRuntime: Shutting down VM
08-30 12:44:04.508 23294-23294/de.nathan.android.droidschool W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41ce6700)
08-30 12:44:04.538 23294-23294/de.nathan.android.droidschool E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to instantiate service de.nathan.android.droidschool.MuteService: java.lang.NullPointerException
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2561)
at android.app.ActivityThread.access$1600(ActivityThread.java:141)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1338)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.content.ContextWrapper.getSystemService(ContextWrapper.java:519)
at de.nathan.android.droidschool.MuteService.<init>(MuteService.java:21)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1130)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2558)
... 10 more
08-30 12:44:04.548 440-1477/? W/ActivityManager: Force finishing activity de.nathan.android.droidschool/.MainActivity
08-30 12:44:04.848 440-1477/? I/WindowManager: Screenshot max retries 4 of Token{42d5f4e8 ActivityRecord{42624258 u0 de.nathan.android.droidschool/.MainActivity}} appWin=Window{42cc6e50 u0 Starting de.nathan.android.droidschool} drawState=4
08-30 12:44:05.358 440-458/? W/ActivityManager: Activity pause timeout for ActivityRecord{42624258 u0 de.nathan.android.droidschool/.MainActivity}
08-30 12:44:07.068 440-458/? W/ActivityManager: Timeout executing service: ServiceRecord{4330adf8 u0 de.nathan.android.droidschool/.MuteService}
08-30 12:44:07.068 440-458/? I/ActivityManager: Crashing app skipping ANR: ProcessRecord{42cf6020 23294:de.nathan.android.droidschool/u0a10018} Executing service de.nathan.android.droidschool/.MuteService
08-30 12:44:15.518 440-458/? W/ActivityManager: Activity destroy timeout for ActivityRecord{42624258 u0 de.nathan.android.droidschool/.MainActivity}