2015-08-15 93 views
0

我一直在试图解决这个问题数周。基本问题是,长时间放置设备(8小时)后,预定的通知将无法激活。在测试中,我一直在使用两个设备,LG Optimus Elite和三星Galaxy Note S4。在Optimus Elite上,通知会在设备被唤醒时发生,但在注意时,通知会完全消失并且不会显示。整个系统在设备醒着或短时间不活动后运行。Android Alarmmanager通知在长时间闲置期间未出现

public class AlarmReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    try { 
     WakeLocker.acquire(context); 
     Bundle bundle = intent.getExtras(); 
     Intent i = new Intent(context, AlarmService.class); 
     i.putExtra("name", bundle.getString("name")); 
     i.putExtra("alarm", bundle.getString("alarm")); 
     context.startService(i); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

}

**public class AlarmService extends Service { 

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

@Override 
public IBinder onBind(Intent arg0) 
{ 
    // TODO Auto-generated method stub 
    return null; 
} 

public void handleIntent(Intent intent){ 
    broadcaster = LocalBroadcastManager.getInstance(this); 
    Bundle bundle = intent.getExtras(); 
    String message = bundle.getString("alarm"); 
    if(message.equals("dosesTakenResetAlarm")){ 
     dailyReset(getApplicationContext()); 
    } 
    else if(message.equals("scheduledReminder")){ 
     scheduledReminder(bundle.getInt("code", 0), bundle.getString("name"), getApplicationContext()); 
    } 
    WakeLocker.release(); 
} 

public void onStart(Intent intent, int startId){ 
    handleIntent(intent); 
} 

public int onStartCommand(Intent intent, int flags, int startId){ 
    handleIntent(intent); 
    return START_NOT_STICKY; 
} 

@Override 
public void onDestroy() 
{ 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
    WakeLocker.release(); 
} 

private void dailyReset(Context context){ 
    FileWriter fw = new FileWriter(context); 
    AlarmCreator ac = new AlarmCreator(); 
    fw.fp.onloadString(fw.readFromFile()); 
    int medNum = 0; 
    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); 
     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(); 
    } 

    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.deleted) 
        .setContentTitle("Pillbud Reminder") 
        .setContentText("Take a dosage of "+n+"."); 
    mBuilder.setDefaults(Notification.DEFAULT_ALL); 
    mBuilder.setContentIntent(pIntent); 
    mBuilder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC); 
    NotificationManager mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
    mNotifyMgr.notify(code, mBuilder.build()); 
} 

} **

此外,如果任何人有关于如何诱导此睡眠状态下这将是测试非常有帮助的任何建议。

+0

为什么要以'droids全称的名义,是否有人投下此问题? WTF? –

回答

0

您需要抢一个WakeLock。看一看无论是WakefulBroadcastReceiver,或CommonsWare盖伊的WakefulIntentService

至于把设备进入休眠状态,如果你有根,则亚行外壳进去,获得root并输入:

echo standby > /sys/power/state 

还有更多有关电源状态的信息here

如果您没有root用户,那么应拨打PowerManager,goToSleep,这应该这样做。您需要授予调用应用“DEVICE_POWER”权限

+0

WakefulBroadcastReceiver是我最初使用的,它似乎工作得很好,除了每个人都有一次,它不会完成“AlarmService”代码。所以我会再次尝试,除了每次循环时更新我的​​文件,我会在最后更新它,并将“Start_Not_Sticky”更改为“Start_Redeliver_Intent”。这将有望带来理想的效果。 – Asky

+0

不客气。 –

相关问题