2017-03-17 4 views
3

Ich möchte, dass mein Dienst zu einem vom Alarmmanager angegebenen Zeitpunkt ausgeführt wird. Aber in meinem Fall läuft es auf die Zeit die ich angegeben habe und auch wenn ich die App nach dem angegebenen Zeit-Service öffne. Ich will es nur zur angegebenen Zeit laufen lassen und es sollte jeden Tag wiederholen. Ich weiß nicht, was im Code falsch ist, den ich geschrieben habe. Jede Hilfe wird geschätzt.Anrufdienst von Broadcast-Empfänger funktioniert nicht wie erwartet

Das ist meine Dienstklasse:

public class AutoLogout extends Service { 

private SQLiteHandler db; 
private SessionManager session; 

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // SqLite database handler 
    db = new SQLiteHandler(getApplicationContext()); 
    // session manager 
    session = new SessionManager(getApplicationContext()); 
    logoutUser(); 
    Toast.makeText(getApplicationContext(),"Service started",Toast.LENGTH_SHORT).show(); 
    return Service.START_STICKY; 
} 

/** 
* Logging out the user. Will set isLoggedIn flag to false in shared 
* preferences Clears the user data from sqlite users table 
*/ 
private void logoutUser() { 
    session.setLogin(false); 
    db.deleteData(); 
    // Launching the login activity 
    Intent intent = new Intent(this, LoginActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent); 
    stopService(new Intent(getApplicationContext(),AutoLogout.class)); 
    Toast.makeText(getApplicationContext(),"Service stopped",Toast.LENGTH_SHORT).show(); 
} 
} 

Das ist mein BroadcastReciever Klasse:

public class AlarmBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "MyReceiver Started", Toast.LENGTH_SHORT).show(); 
     Intent intent1 = new Intent(context,AutoLogout.class); 
     context.startService(intent1); 
    } 
} 

CategoryActivity.java wo i Alarmmanager in oncreate Methode nenne:

public class CategoryActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_category); 
    Calendar cal_alarm = Calendar.getInstance(); 
      cal_alarm.set(Calendar.HOUR_OF_DAY,14); 
      cal_alarm.set(Calendar.MINUTE,46); 
      cal_alarm.set(Calendar.SECOND,00); 
      Intent intent = new Intent(this, AlarmBroadcastReceiver.class); 
      PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 234324243, intent, PendingIntent.FLAG_ONE_SHOT); 
      AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
      alarmManager.setExact(AlarmManager.RTC_WAKEUP, cal_alarm.getTimeInMillis() , pendingIntent); 

} 
} 

Dies ist in meiner Manifest-Datei:

+1

Vielleicht ist dies für Sie? https://developer.android.com/reference/android/app/IntentService.html – Fildor

+0

Warum verwenden Sie eine Aktivität zum Zurücksetzen des Alarms? Übrigens bezweifle ich, dass der CategoryActivity-Code kompiliert wird. Sie führen Code außerhalb jeder Methode oder Ctor aus ... haben Sie etwas kopiert? – Fildor

+0

@Fildor: wo muss ich den Alarm zurückrufen? –

Antwort

1

Das Problem tritt auf, da jedes Mal, wenn Sie die Aktivität öffnen, die den Alarm setzt, der Alarm neu initialisiert wird - der Alarm wird jedoch bei jedem Öffnen der Aktivität fälschlicherweise ausgelöst, weil die richtige Alarmzeit (14:46:00) ist wahrscheinlich bereits am aktuellen Tag vergangen, und wenn Sie einen AlarmManager Alarm für eine Zeit setzen, die bereits vergangen ist, wird es sofort ausgelöst.

Um dies zu beheben, müssen wir, wenn die Alarmzeit bereits für den aktuellen Tag vergangen ist zu prüfen, und falls ja, stellen Sie den Alarm für 14.46.00 auf dem folgenden Tage:

if (cal_alarm.getTimeInMillis() < System.currentTimeMillis()) { 
     cal_alarm.add(Calendar.DATE, 1); 
} 

Hier ist, wie es in Ihrem CategoryActivity aussehen:

public class CategoryActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_category); 
     Calendar cal_alarm = Calendar.getInstance(); 
     cal_alarm.setTimeInMillis(System.currentTimeMillis()); // i added this to ensure the calendar is being configured correctly 
     cal_alarm.set(Calendar.HOUR_OF_DAY,14); 
     cal_alarm.set(Calendar.MINUTE,46); 
     cal_alarm.set(Calendar.SECOND,00); 

     //check if time has already passed today, adjust alarm to tomorrow if it has 
     if (cal_alarm.getTimeInMillis() < System.currentTimeMillis()) { 
      cal_alarm.add(Calendar.DATE, 1); 
     } 

     Intent intent = new Intent(this, AlarmBroadcastReceiver.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 234324243, intent, PendingIntent.FLAG_ONE_SHOT); 
     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     alarmManager.setExact(AlarmManager.RTC_WAKEUP, cal_alarm.getTimeInMillis() , pendingIntent); 
    } 
} 

die if Anweisung überprüft einfach, ob die aktuelle Zeit größer als die Zeit ist, dass cal_alarm für ein gesetzt nd wenn es ist, setzt der Alarm für 14:46:00 morgen. Wenn Sie mehr Klarheit brauchen, zögern Sie nicht zu fragen!

+0

'cal_alarm.add (Calendar.DATE, 1)' ist diese Zeile, die den Alarm für den nächsten Tag zur selben Zeit setzt? –

+0

Richtig, das macht es für den nächsten Tag (nicht den 1. des Monats, wie es scheinen mag). Sie überprüfen, ob die Alarmzeit bereits verstrichen ist, und fügen diese Zeile nur hinzu, wenn die Zeit am aktuellen Tag verstrichen ist. –

+0

in Ordnung. Ich habs.über Code funktionierte für mich :) –

Verwandte Themen