AlarmManager Zeit-Überschreibung

  • 4 Antworten
  • Neuester Beitrag
Diskutiere AlarmManager Zeit-Überschreibung im Android App Entwicklung im Bereich Betriebssysteme & Apps.
2

2slow4you

Gast
Hallo,
ich habe im Moment ein Problem mit dem AlarmManager: wenn man einen Button drückt, wird ein AlarmManager gestartet, und das funktioniert auch alles reibungslos. Wenn man aber danach, also während der Erste noch läuft, einen zweiten (anderen) AlarmManager startet, übernimmt der Erste die Zeit vom Zweiten. Das sieht dann so aus, dass der erste AM und der zweite AM zur gleichen Zeit zwei Notifications senden.
Das ist der Code für die Buttons:
Code:
switch (v.getId()) {
        case (R.id.buttona1):
        lol_newtime_a1 = 300000;//300 seconds
        lol_actualtimea1 = lol_newtime_a1;
        Toast.makeText(getApplicationContext(),"1. gestartet", Toast.LENGTH_SHORT).show();
        
        //set AlarmManager
        lol_newtime_a1 = new GregorianCalendar().getTimeInMillis() + lol_newtime_a1;
        Intent intent_lol_a1 = new Intent(this, AlarmReciever.class);
        Bundle lol_extras_a1 = new Bundle();
        lol_extras_a1.putString("title", (getResources().getString(R.string.game_lol_a1)));
        lol_extras_a1.putString("what", "The " + (getResources().getString(R.string.game_lol_a1)) + " " + end1);
        intent_lol_a1.putExtras(lol_extras_a1);
        
        AlarmManager lol_alarmManager_a1 = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        lol_alarmManager_a1.set(AlarmManager.RTC_WAKEUP, lol_newtime_a1,
                PendingIntent.getBroadcast(this, 1,  intent_lol_a1, PendingIntent.FLAG_UPDATE_CURRENT));
        refreshLoL(1);
        lol_timerHasStarted_a1 = true;
        break;      
        
        case (R.id.buttona2):
        lol_newtime_a2 = 360000;//360 seconds
        lol_actualtimea2 = lol_newtime_a2;
        Toast.makeText(getApplicationContext(),"2. gestartet", Toast.LENGTH_SHORT).show();
        
        //set AlarmManager
        lol_newtime_a2 = new GregorianCalendar().getTimeInMillis() + lol_newtime_a2;
        Intent intent_lol_a2 = new Intent(this, AlarmReciever.class);
        Bundle lol_extras_a2 = new Bundle();
        lol_extras_a2.putString("title", (getResources().getString(R.string.game_lol_a2)));
        lol_extras_a2.putString("what", "The " + (getResources().getString(R.string.game_lol_a2)) + " " + end1);
        intent_lol_a2.putExtras(lol_extras_a2);
        
        AlarmManager lol_alarmManager_a2 = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        lol_alarmManager_a2.set(AlarmManager.RTC_WAKEUP, lol_newtime_a2,
                PendingIntent.getBroadcast(this, 2,  intent_lol_a2, PendingIntent.FLAG_UPDATE_CURRENT));
        refreshLoL(2);
        lol_timerHasStarted_a2 = true;
        break;
Und das ist der Code aus dem Reciever:
Code:
@Override
            public void onReceive(Context context, Intent intent) {
             String what = intent.getStringExtra("what");
             String title = intent.getStringExtra("title");
             showNotification(context, title, what);
             }
         
         private void showNotification(Context context, String title, String what) {
             Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
                        new Intent(context, MainGameActivity.class), 0);

                NotificationCompat.Builder mBuilder =
                        new NotificationCompat.Builder(context)
                        .setSound(soundUri)
                        .setLights(0xffcc0000, 1000, 100)
                        .setAutoCancel(true)
                        .setSmallIcon(R.drawable.ic_notification)
                        .setContentTitle(title)
                        .setContentText(what)
                        .setTicker(what);
                mBuilder.setContentIntent(contentIntent);
                mBuilder.setDefaults(Notification.DEFAULT_SOUND);
                mBuilder.setAutoCancel(true);
                NotificationManager mNotificationManager =
                    (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                
                Random generator = new Random();
                int id = generator.nextInt( 564651684 );
                mNotificationManager.notify(id, mBuilder.build());

            }
Weiß jemand Rat? Verschiedene AM und IDs hab ich ja schon...
 
A

amfa

Dauergast
Ohne das im Detail gelesen zu haben.

Wenn ich dich richtig verstehe, dann sollen die Notifications zwar beide erscheinen aber zu unterschiedlichen Zeiten ja?

Auf welcher Android Version arbeitest du?
Seit API 19 (KitKat) laufen die Alarme nämlich nicht mehr exakt, das heißt das System versucht möglichst selten aufzuwachen um etwas auszuführen um Batterien zu sparen.
Heißt wenn du 10 Alarme setzt mit jeweils einer Sekunde Unterschied, kann es normal sein, dass diese alle gleichzeitig ausgeführt werden, anstatt das Telefon jede Sekunde aufzuwecken um den Alarm auszuführen.

Wenn du es zwingend ganz exakt brauchst:
AlarmManager | Android Developers
 
2

2slow4you

Gast
Ja, sollen beide erscheinen, zu unterschiedlichen Zeiten, und ich arbeite mit API 19.
Wenn der Bildschirm aber läuft, geht das Handy doch gar nicht in den Ruhestand, oder?
Aber ich guck mir dann später mal an, wie man auf KitKat exakt mit dem AM arbeiten kann, danke schonmal.
 
A

amfa

Dauergast
Ich bin mir nicht sicher, denke aber der Alarmanager packt die IMMER zusammen und führt die dann gleichzeitig aus.

Es gibt die Methode setExact die ich oben verlinkt hab, damit sollte der exakt arbeiten, ansonsten aber genau so wie du ihn benutzt.
 
2

2slow4you

Gast
Code:
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.KITKAT){
            lol_alarmManager_b5.setExact(AlarmManager.RTC_WAKEUP, lol_newtime_b5,
                    PendingIntent.getBroadcast(this, 10,  intent_lol_b5, PendingIntent.FLAG_UPDATE_CURRENT));            
        } 
        else{
            lol_alarmManager_b5.set(AlarmManager.RTC_WAKEUP, lol_newtime_b5,
                    PendingIntent.getBroadcast(this, 10,  intent_lol_b5, PendingIntent.FLAG_UPDATE_CURRENT));            
        }
Vielen, vielen Dank, es funktioniert jetzt!:thumbsup:
amfa, du hast den Namen Android Experte verdient!
 
Ähnliche Themen - AlarmManager Zeit-Überschreibung Antworten Datum
3