Mein Ziel: Eine garantierte Activity pro Tag, nämlich wenn das Smartphone angeschaltet wird und die Activity zum Einschaltdatum noch nicht aufgerufen wurde. Solche Dinge sollte man natürlich sehr bewusst programmieren, um keinen Benutzer zu nerven. In diesem Fall bin ich aber der Benutzer.
In der Referenz des Android SDK finde ich ein Systemereignis, welches in Frage kommt, um von einem Broadcast Receiver empfangen zu werden: ACTION_SCREEN_ON. Während ich mittels der AndroidManifest.xml für viele Ereignisse ganz zentral Broadcast Receiver während der Installation einer Anwendung im Betriebssystem registrieren kann, ist dies aber ausgerechnet für dieses Ereignis nicht möglich. Ich habe einige Codebeispiele gesehen, in denen Broadcast Receiver in der OnCreate von Activities registriert wurden. Doch möchte ich den Receiver von der aufgerufenen Activity entkoppeln. Nach weiterer Suche entdecke ich das Ereignis ACTION_USER_PRESENT, welches auch ein mittels der AndroidManifest.xml registrierter Broadcast Receiver empfangen kann.
Wird das Ereignis mit nachfolgendem ActivityLauncher empfangen, wird das Datum des heutigen Tages mit dem eingelesenen Datum aus einer Datei verglichen. Unterscheiden sich die Angaben, wird das aktuelle Datum in die Datei geschrieben und die Activity wird aufgerufen.
public class ActivityLauncher extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (! (intent.getAction().equals(Intent.ACTION_USER_PRESENT)))
return;
String date = GetDateFromFile(context);
Date dateNow = new Date ();
SimpleDateFormat dateformatYYYYMMDD = new SimpleDateFormat("yyyyMMdd");
StringBuilder nowYYYYMMDD = new StringBuilder( dateformatYYYYMMDD.format( dateNow ) );
String now = nowYYYYMMDD.toString();
if (date.compareTo(now) != 0)
{
WriteCurrentDateToFile(context, now);
Intent startActivity = new Intent();
startActivity.setClass(context, MyActivity.class);
startActivity.setAction(MyActivity.class.getName());
startActivity.setFlags(
Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(startActivity);
}
}
}