Android IntentService在长时间空闲期间启动后被终止

Android IntentService在长时间空闲期间启动后被终止,android,service,intentservice,Android,Service,Intentservice,在我的手机闲置了几个小时(通常是8小时左右)后,计划的IntentService将启动,但永远不会结束。我在使用服务和启动时遇到了同样的问题。当手机正在使用或最近使用时,它似乎工作正常 未完成的代码片段是DailySet。第一个通知发出了,所以我知道它至少在终止之前到达了那里 public class AlarmService extends IntentService { LocalBroadcastManager broadcaster; static final public Strin

在我的手机闲置了几个小时(通常是8小时左右)后,计划的IntentService将启动,但永远不会结束。我在使用服务和启动时遇到了同样的问题。当手机正在使用或最近使用时,它似乎工作正常

未完成的代码片段是DailySet。第一个通知发出了,所以我知道它至少在终止之前到达了那里

public class AlarmService extends IntentService {

LocalBroadcastManager broadcaster;
static final public String REFRESH_INTENT = "rf";

public AlarmService() {super("AlarmService");}

public void onHandleIntent(Intent intent){
    broadcaster = LocalBroadcastManager.getInstance(this);
    Bundle bundle = intent.getExtras();
    String message = bundle.getString("alarm");
    if(message.equals("dosesTakenResetAlarm")){
        scheduledReminder(bundle.getInt("code"), "RESET", getApplicationContext());
        dailyReset(getApplicationContext());
        scheduledReminder(bundle.getInt("code")+1, "FINISH", getApplicationContext());
    }
    else if(message.equals("scheduledReminder")){
        scheduledReminder(bundle.getInt("code"), bundle.getString("name"), getApplicationContext());
    }
    WakefulBroadcastReceiver.completeWakefulIntent(intent);
}

private void dailyReset(Context context){
    FileWriter fw = new FileWriter(context);
    AlarmCreator ac = new AlarmCreator();
    String saveString = "";
    int start = 0;
    int medNum = 0;
    fw.fp.onloadString(fw.readFromFile());
    if(fw.fp.hasNext()){start = fw.readEntry(medNum).position1;}
    while(fw.fp.hasNext()){
        SaveData mv = fw.readEntry(medNum);
        fw.fp.onloadMedString(mv.data);
        String name = fw.fp.nextMedVariable();
        String doses = fw.fp.nextMedVariable();
        String frequency = fw.fp.nextMedVariable();
        String frequencyS = fw.fp.nextMedVariable();
        String reminders = fw.fp.nextMedVariable();
        String dosesT = fw.fp.nextMedVariable();
        frequencyS = ""+(Integer.parseInt(frequencyS)-1);
        if(Integer.parseInt(frequencyS) < 0){
            frequencyS = ""+(Integer.parseInt(frequency)-1);
        }
        //fw.replaceEntry(fw.fp.buildMedSaveString(name, doses, frequency, frequencyS, reminders, "0"), mv.position1, mv.position2);
        saveString += fw.fp.buildMedSaveString(name, doses, frequency, frequencyS, reminders, "0");
        if(frequencyS.equals("0")){
            fw.fp.onloadReminderString(reminders);
            int reminderNum = 0;
            while(fw.fp.hasNextReminder()){
                ReminderData temp = fw.fp.nextReminder();
                if(temp.half.equals("1")){
                    temp.hour = ""+(Integer.parseInt(temp.hour)+12);
                }
                ac.setAlarm(Integer.parseInt(temp.hour), Integer.parseInt(temp.minute), 0, ac.buildAlarmCode(medNum, reminderNum), name);
                reminderNum++;
            }
        }
        medNum++;
        fw.fp.nextMedication();
    }
    if(medNum > 0){
        fw.replaceEntry(saveString, start, fw.readFromFile().length());
        System.out.println(fw.readFromFile());
    }

    Intent intent = new Intent(REFRESH_INTENT);
    broadcaster.sendBroadcast(intent);
}

private void scheduledReminder(int code, String n, Context context){
    Intent intent = new Intent(context, Main.class);
    PendingIntent pIntent = PendingIntent.getActivity(context, 101, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(context)
                    .setSmallIcon(R.drawable.nicon)
                    .setContentTitle("Pillbud Reminder")
                    .setContentText("Take a dosage of "+n+".  "+code);
    mBuilder.setDefaults(Notification.DEFAULT_ALL);
    mBuilder.setContentIntent(pIntent);
    mBuilder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
    NotificationManager mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    mNotifyMgr.notify(code, mBuilder.build());
}
公共类AlarmService扩展了IntentService{
本地广播经理;
静态最终公共字符串刷新\u INTENT=“rf”;
公共AlarmService(){super(“AlarmService”);}
处理内容上的公共无效(意图){
broadcaster=LocalBroadcastManager.getInstance(this);
Bundle=intent.getExtras();
字符串消息=bundle.getString(“报警”);
if(message.equals(“dosesTakenResetAlarm”)){
scheduledReminder(bundle.getInt(“代码”),“重置”,getApplicationContext());
dailyReset(getApplicationContext());
scheduledReminder(bundle.getInt(“代码”)+1,“完成”,getApplicationContext());
}
else if(message.equals(“scheduledReminder”)){
scheduledReminder(bundle.getInt(“代码”)、bundle.getString(“名称”)、getApplicationContext();
}
WakefulBroadcastReceiver.completeWakefulIntent(intent);
}
私有void dailyReset(上下文){
FileWriter fw=新的FileWriter(上下文);
AlarmCreator ac=新的AlarmCreator();
字符串saveString=“”;
int start=0;
int-medNum=0;
fw.fp.onloadString(fw.readFromFile());
if(fw.fp.hasNext()){start=fw.readEntry(medNum.position1;}
while(fw.fp.hasNext()){
SaveData mv=fw.readEntry(medNum);
fw.fp.onloadMedString(中压数据);
字符串名称=fw.fp.nextMedVariable();
字符串剂量=fw.fp.nextMedVariable();
字符串频率=fw.fp.nextMedVariable();
字符串频率=fw.fp.nextMedVariable();
字符串提醒=fw.fp.nextMedVariable();
字符串dosesT=fw.fp.nextMedVariable();
frequencyS=”“+(Integer.parseInt(frequencyS)-1);
if(整数.parseInt(频率)<0){
frequencyS=“”+(整数.parseInt(频率)-1);
}
//fw.replaceEntry(fw.fp.buildMedSaveString(名称、剂量、频率、频率、提醒,“0”)、mv.position1、mv.position2;
saveString+=fw.fp.buildMedSaveString(名称、剂量、频率、频率、提醒,“0”);
if(频率等于(“0”)){
fw.fp.onload提醒字符串(提醒);
int-rementernum=0;
而(fw.fp.hasNextReminder()){
提醒数据温度=fw.fp.nextReminder();
如果(温度的一半等于(“1”)){
temp.hour=“”+(Integer.parseInt(temp.hour)+12);
}
ac.setAlarm(Integer.parseInt(temp.hour)、Integer.parseInt(temp.minute)、0、ac.buildAlarmCode(medNum、rementernum)、name);
提醒++;
}
}
medNum++;
fw.fp.nextmediation();
}
如果(medNum>0){
replaceEntry(saveString,start,fw.readFromFile().length());
System.out.println(fw.readFromFile());
}
意向意向=新意向(刷新意向);
广播者。发送广播(意图);
}
私有void scheduledReminder(int代码,字符串n,上下文){
意图=新意图(上下文,Main.class);
PendingEvent pIntent=PendingEvent.getActivity(上下文,101,意图,PendingEvent.FLAG_UPDATE_CURRENT);
通知相容建筑商mBuilder=
新建NotificationCompat.Builder(上下文)
.setSmallIcon(R.drawable.nicon)
.setContentTitle(“枕边提醒”)
.setContentText(“服用剂量为“+n+”+代码);
mBuilder.setDefaults(Notification.DEFAULT_ALL);
mBuilder.setContentIntent(pIntent);
mBuilder.setVisibility(通知兼容性VISIBILITY\u PUBLIC);
NotificationManager mNotifyMgr=(NotificationManager)getSystemService(通知服务);
mNotifyMgr.notify(代码,mBuilder.build());
}

什么是
FileWriter#readEntry
?保存文件的信息被分为多个条目。readEntry方法只读取指定的数字,并返回一个包含保存字符串及其开始和结束位置的SaveData类。因此它会阻塞,或
hasNext
否,readEntry只读取它,而不递增。nextMedical增量,然后如果没有其他内容,则将hasNext改为false。最初我使用NextMedical仅返回字符串,但我使用readEntry方法,因为偶尔我需要更多信息。NextMed变量显示其基本功能。没有任何代码,很难判断任何内容,没有人是oracle。。。