2016-03-27 11 views
1

Ich habe eine App, die ein Wecker sein sollte. Wenn ich die Benachrichtigungszeit etwa 5 Minuten oder 30 Minuten einstelle, klingelt es wie es soll, aber wenn ich es etwa 4 Stunden wegsetze, klingelt es nicht, weder wenn mein Gerät nie berührt wird (über Nacht), noch wenn ich es benutze es regelmäßig (am Tag).WakefulBrodcastReceiver/Alarm klingelt nicht (Wakelock? Prozess getötet?)

PowerManager powman = (PowerManager) getSystemService(POWER_SERVICE); 
PowerManager.WakeLock wakeLock = powman.newWakeLock(PowerManager.FULL_WAKE_LOCK,"MyWakelockTag"); 
wakeLock.acquire(); 

Dann rufe ich meine AlarmReceiver wie folgt aus::

Intent alarmIntent = new Intent(main.this, AlarmReceiver.class); 
PendingIntent alarmPendingIntent = PendingIntent.getBroadcast(main.this, 8932, alarmIntent, 0); 
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
manager.set(AlarmManager.RTC_WAKEUP, AlertDate.getTime(), alarmPendingIntent); 

Und schließlich mein AlarmReceiver sieht wie folgt aus:

public class AlarmReceiver extends WakefulBroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     main.Alert(context); 
    } 
} 

Im Haupt Methode, die ich dieses Wackelock habe

Mein Manifest ist hier:

<uses-permission android:name="android.permission.WAKE_LOCK" /> 

... 

<application 

... 

    <receiver 
     android:name=".AlarmReceiver" 
     android:permission="android.permission.WAKE_LOCK"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED"/> 
     </intent-filter> 
    </receiver> 

</application> 

Also ist die sehr kurze Frage: Warum wird main.Alert(context); nicht nach einer längeren Zeit aufgerufen? Wird der Prozess möglicherweise durch die Android OS getötet?

+0

Haben Sie WAKE_UP Erlaubnis zu manifesten? und erkläre AlarmReceiver zu manifest – GiapLee

+0

ja ich habe beide :) Ich habe es in meinem Beitrag über –

Antwort

0

@ Pixel_95 Was macht main.Alert(context);? Wie auch immer, PowerManager muss FULL_WAKE_LOCK im Konstruktor (nicht PARTIAL) oder so ähnlich sein, aber wenn Sie WakefullBroadcastReceiver verwenden, müssen Sie completeWakefulIntent(intent); anrufen, um das Gerät zu wecken, und wenn Sie das tun, werden Sie nicht brauche die Codezeilen von PowerManager.

+0

hinzugefügt jetzt habe ich 'FULL_WAKE_LOCK' und die' completeWakefulIntent (Absicht): 'aber es funktioniert immer noch nicht für mehr als 3 Stunden. .. –

Verwandte Themen