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