Android Benachrichtigung zum Zeitpunkt ers

jerevat

Mitglied
Hallo,

ich habe hier eine Auflistung von Themen, ähnlich einem TV-Programm.
Manche Themen sind interessant, andere weniger, und von den Interessanten will ich benachrichtigt werden.
Diese Benachrichtigung soll zu einem festgelegten Zeitpunkt (kann Tage, Monate oder Jahre später) passieren und ich möchte auch, wenn nötig, die Erinnerung an die Benachrichtigung abbrechen.

Hierzu einige Unklarheiten:
  • Was hat es mit der "Channel-Id" auf sich? Benötige ich für jedes einzelne ausgewählte Thema in der Auflistung eine eindeutige Channel-Id oder stellt diese eine Art Wiedererkennung der App dar?
  • Wie erfolgt der Start und der Abbruch einer zeitgerichteten Benachrichtigung? Aus dem folgenden Code geht unklar hervor, wie die App wissen soll, welche Benachrichtigung beim Abbruch gemeint ist.

Broadcast Receiver:
Java:
public class NotificationReceiver extends BroadcastReceiver {
    private static String _channelId = "";
    private static String _title = "Erinnerung";
    private static String _text = "";

    public static String getChannelId() {
        return _channelId;
    }

    public static void setChannelId(String channelId) {
        _channelId = channelId;
    }

    public static String getTitle() {
        return _title;
    }

    public static void setTitle(String title) {
        _title = title;
    }

    public static String getText() {
        return _text;
    }

    public static void setText(String text) {
        _text = text;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, _channelId);
        builder.setContentTitle(_title);
        builder.setContentText(_text);
        builder.setSmallIcon(R.mipmap.ic_launcher);
        builder.setPriority(NotificationCompat.PRIORITY_DEFAULT);
        builder.setAutoCancel(true);

        NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
        if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(context, "Benachrichtigung aktivieren!" , Toast.LENGTH_LONG).show();
            return;
        }
        managerCompat.notify(1, builder.build());
    }
}

Hauptanwendung:
Java:
import org.joda.time.DateTime;

public class MainActivity extends AppCompatActivity {
    Intent _intent;
    PendingIntent _pendingIntent;
    AlarmManager _alarmManager;
    NotificationChannel _notificationChannel;
    NotificationManager _notificationManager;
    String _channelId;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        _intent = new Intent(MainActivity.this, NotificationReceiver.class);
        _pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, _intent, PendingIntent.FLAG_IMMUTABLE);
        _alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    }

    private void createNotifcationChannel() {
        _notificationChannel = null;
        _notificationManager = null;
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) { // > API 25
            _notificationChannel = new NotificationChannel(_channelId, String.valueOf(R.string.app_name), NotificationManager.IMPORTANCE_DEFAULT);
            _notificationManager = getSystemService(NotificationManager.class);
            _notificationManager.createNotificationChannel(_notificationChannel);
    }

    private void startNotification() {
        _channelId = "neue id";
        NotificationReceiver.setChannelId(_channelId);
        createNotifcationChannel();

        DateTime dummy = new DateTime(2024, 3 , 2, 1, 0);
        long milliseconds = dummy .getMillis();

        _alarmManager.set(AlarmManager.RTC_WAKEUP, milliseconds, _pendingIntent);
    }

    private void stopNotification() {
        _alarmManager.cancel(_pendingIntent);
    }
}
 

Jw456

Top Contributor
Wie erfolgt der Start und der Abbruch einer zeitgerichteten Benachrichtigung? Aus dem folgenden Code geht unklar hervor, wie die App wissen soll, welche Benachrichtigung beim Abbruch gemeint ist
Hallo da stellt sich mir erst mal die frage von wo der Anstoß zum Benachrichtigen her kommt? Doch wohl nicht von deiner App selber. Also nicht AlarmManager.

Da wird doch wohl ein Server dahinter stehen. Der dann zb mit FCM eine Push Nachricht sendet.

Also i schaue dir dises Tehma mal an.
 
Zuletzt bearbeitet:

jerevat

Mitglied
Hab Dank, das war sehr hilfreich.
Also muss für jede einzelne Benachrichtigung ein eigener NotificationChannel (ab API 26) mit einer eindeutigen Channel-Id angelegt werden.

Hallo da stellt sich mir erst mal die frage von wo der Anstoß zum Benachrichtigen her kommt? Doch wohl nicht von deiner App selber. Also nicht AlarmManager.

Da wird doch wohl ein Server dahinter stehen. Der dann zb mit FCM eine Push Nachricht sendet.
Es gibt weder einen Server noch eine Datenbank. Die aufgelisteten Einträge werden von der App lokal erstellt, daher muss die App sich auch um die Benachrichtigungen kümmern. Die Benachrichtigungen müssen zu einem festgelegten Zeitpunkt erscheinen, und dazu fällt mir nur der AlarmManager ein. Nur so, wie der AlarmManager funktioniert, bringt er mich nicht weiter.
 

Jw456

Top Contributor
Vielleicht der Jobscheduler .
Eine Activity / Service der in Android 24/7 läuft, ist schwierig duldet Android eigentlich nicht.

Wenn du den AL selber benutzt weißt kennst du doch auch die Instanz kannst ihn also auch beenden abrechen.
 

Jw456

Top Contributor
Genau und auch ein en neuen PendingIntent.
Wieviel der Alarmmanager packt kann ich nicht sagen.
Bedenke auch das der mir "set" gesetzte Alarm recht ungenau ist. Er muß und wird nicht unbedingt immer auf die Minute genau kommen. Kann auch mal eine Stunde später kommen.

Wenn es genauer sein sollte schaue in die Doku was es noch gibt.

 
Zuletzt bearbeitet:

jerevat

Mitglied
Das funktioniert soweit, wenn ich eine einzige Benachrichtigung mittels AlarmManager ausführen lasse.

Hauptanwendung:
Java:
int _dummy = 1;

@SuppressLint("ScheduleExactAlarm")
private void startNotification() {
    _pendingIntent = null; 
    if (_requestCode < 0)
        return;

    _pendingIntent = PendingIntent.getBroadcast(MainActivity.this, _requestCode, _intent, PendingIntent.FLAG_IMMUTABLE);
    NotificationReceiver.setChannelId(_channelId);
    NotificationReceiver.setText(_dummy + "");  // _dummy zu Testzwecken ausgeben
    createNotifcationChannel();

    DateTime dt = DateTime.now().plusMinutes(_dummy);
    long ms = dt.getMillis();
    _alarmManager.setExact(AlarmManager.RTC_WAKEUP, ms, _pendingIntent);
    _dummy ++;
}

Sind es zwei oder mehr Benachrichtigungen, erscheinen diese auch zur vereinbarten Zeit, aber der Text / die dummy-Variable ist in allen Benachrichtigungen derselbe / dieselbe.
Also, bei drei Aufrufen kommen in Minutentakt drei Benachrichtigungen mit dem Text "3".
Ich verstehe nicht, wieso der Textinhalt in allen vorher erstellten Benachrichtigungen überschrieben wird?
 

Jw456

Top Contributor
Benutze den NotificationManager und NotificationCompat.Builder .

Im Builder gibst du deinen Text, Icon… an.
Das sehe ich nicht in deinem code nicht, das ist bei dir sicher in allen Nachrichten gleich.

Das ist sicher nicht der Text.
"NotificationReceiver.setText(_dummy + ""); // _dummy zu Testzwecken ausgeben"



 

KonradN

Super-Moderator
Mitarbeiter
Das dürfte daran liegen, weil Du in onReceive des NotificationManager die statische Variable _text verwendest um da etwas anzuzeigen. Und da ist dann halt der letzte Wert drin, den Du gesetzt hast.
 

KonradN

Super-Moderator
Mitarbeiter
Den NotificationCompat.Builder nutzt er ja - wenn er den intent empfängt.

Er versendet ja den intent und da müssen dann die Daten mit hinein. Da ist halt der _intent von ihm wichtig. Da kann er mit putExtra Daten hinterlegen. Aber vermutlich wird es da auch nicht reichen, dass er nur einen _intent erzeugt sondern er muss dann halt jedes Mal einen neuen Intent erzeugen. Also etwas wie:
Java:
private void startNotification() {
    if (_requestCode < 0)
        return;

    _intent = new Intent(MainActivity.this, NotificationReceiver.class);
    _intent.putExtra("message", String.valueOf(_dummy));
    _pendingIntent = PendingIntent.getBroadcast(MainActivity.this, _requestCode, _intent, PendingIntent.FLAG_IMMUTABLE);
    NotificationReceiver.setChannelId(_channelId);
    createNotifcationChannel();

    DateTime dt = DateTime.now().plusMinutes(_dummy);
    long ms = dt.getMillis();
    _alarmManager.setExact(AlarmManager.RTC_WAKEUP, ms, _pendingIntent);
    _dummy ++;
}

Und bei dem onReceive bekommst Du ja den intent und kannst dann da das Extra auslesen. Da wir ein String verwendet haben, wäre das dann ìntent.getStringExtra("message");`


Und dann noch ein paar Anmerkungen:
a) Versuche ohne diese ganzen static Variablen aus zu kommen. Das ist einfach nur extrem fehlerträchtig und führt auch zu schwer zu lesendem Code und das Fehler finden wird erschwert.
b) Wenn Du eine Variable neu setzen willst, dann musst Du diese nicht erst auf null setzen.
c) Gerade so Dinge, die Du in einer Methode erzeugst und die Du nur in der Methode brauchst: Nutz da lokale Variablen!
d) So Konstanten wie "message" am Besten auch wirklich in eine Konstante packen
 

jerevat

Mitglied
Und bei dem onReceive bekommst Du ja den intent und kannst dann da das Extra auslesen. Da wir ein String verwendet haben, wäre das dann ìntent.getStringExtra("message");`
Was ist mit "message" gemeint?

a) Hier habe ich static-Variablen angewandt, weil ich sonst keine Möglichkeit sah, wie ich jene Werte setzen könnte.
b) In anderen Sprachen werden Variablen / Objekte null gesetzt, bevor sie erneut mit "new" initialisiert werden. Ich nahm an, in Java wäre es nicht viel anders.
c) Ja, das mit den globalen und lokalen Variablen sollte ich hier intelligenter lösen.
d) Soll "message" als final-Konstante oder als String-Ressource hinterlegt werden? Nebenbei, wann macht es Sinn etwas als final-Konstante im Quellcode zu definieren und wann als Ressource im XML?
 

KonradN

Super-Moderator
Mitarbeiter
a) Hier habe ich static-Variablen angewandt, weil ich sonst keine Möglichkeit sah, wie ich jene Werte setzen könnte.
Ja, es ist am Anfang schwer, in dieses objektorientierte Denken zu kommen. Man lernt Java meist nur die Syntax ohne wirklich auch die objektorientierte Entwicklung zu lernen. Das macht es relativ schwer. Aber das ist nun einmal der ganz wichtige Punkt hier. Eine static Variable ist in der Regel immer schlecht und es bedarf einer guten Begründung, wieso sowas notwendig sein soll.

b) In anderen Sprachen werden Variablen / Objekte null gesetzt, bevor sie erneut mit "new" initialisiert werden.
Das wäre mir neu. Variablen werden neue Werte zugewiesen und damit ist der alte, gespeicherte Wert weg. Dieses null zuweisen vor der Zuweisung eines anderen Wertes ist daher unnötig.

Was ist mit "message" gemeint?
d) Soll "message" als final-Konstante oder als String-Ressource hinterlegt werden? Nebenbei, wann macht es Sinn etwas als final-Konstante im Quellcode zu definieren und wann als Ressource im XML?
message ist einfach nur ein Key, um den Wert zu identifizieren. Diese Extras sind einfach eine Map (Android hat hier die spezielle Klasse Bundle), welche zu Schlüsseln (welche vom Typ String sind) Werte speichern kann. Wir speichern also die Nachricht einfach in einem Key "message". Da kannst Du aber beliebige Keys verwenden. Das ist egal.

Und das ist etwas, das rein intern in der Anwendung ist. Das interessiert nur den Entwickler selbst. Daher ist es eine konstante im Code. Eine Ressource ist immer etwas, das separat vom Code existiert und das dann auch von anderen angepasst werden kann. Typische Fälle hier z.B. Texte, die übersetzt werden könnten. Oder Dinge, die zur Laufzeit geladen werden sollen (Bilder und so).
 

jerevat

Mitglied
Und bei dem onReceive bekommst Du ja den intent und kannst dann da das Extra auslesen. Da wir ein String verwendet haben, wäre das dann ìntent.getStringExtra("message");`
Das hat mein Problem gelöst. Danke!

Hauptanwendung:
Java:
private void startNotification() {
    if (_requestCode < 0)
        return;

    _intent = new Intent(MainActivity.this, NotificationReceiver.class);
    _intent.putExtra("text", String.valueOf(_dummy))
    // ...

Broadcast Receiver:
Java:
@Override
public void onReceive(Context context, Intent intent) {
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context, _channelId);
    builder.setContentText(intent.getExtras().getString("text"));
    // ...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Benachrichtigung Freigabe ab Android 14 Android & Cross-Platform Mobile Apps 1
BossLama Android Android Auto mit Linux Android & Cross-Platform Mobile Apps 1
A Was übersehe ich bei der Einrichtung eines neuen Android-Studios Android & Cross-Platform Mobile Apps 56
W Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing com.android.build.gradle.inter Android & Cross-Platform Mobile Apps 18
S Android API 35+ Status/Navigation bar color/height from Java Android & Cross-Platform Mobile Apps 0
D Android Android Studio plus Gradle 7.5 bauen anders die apk Android & Cross-Platform Mobile Apps 0
J Das Beispiel von Android erzeugt Fehler Android & Cross-Platform Mobile Apps 8
J Zeitdifferenzen unter Android 7 (API < 26) berechnen Android & Cross-Platform Mobile Apps 4
W Netzwerk Verbindungen Java Android Android & Cross-Platform Mobile Apps 107
Z Android IntelliJ Android & Cross-Platform Mobile Apps 2
M Repository bei Room-Database in Android Studio (Java) Android & Cross-Platform Mobile Apps 2
Android App auf das eigene Handy bekommen Android & Cross-Platform Mobile Apps 3
Alex IV Android App erstellen Android & Cross-Platform Mobile Apps 3
OnDemand CrossPlatform Kotlin iOs/Android Datenverbrauch Android & Cross-Platform Mobile Apps 2
W In Android Studio Integer an andere activities übergeben Android & Cross-Platform Mobile Apps 2
wladp Android Studio Room Database Android & Cross-Platform Mobile Apps 1
N "Schöne" Datatable in Android und setzen von Parametern von Textview im Code Android & Cross-Platform Mobile Apps 5
N Android game programmieren Android & Cross-Platform Mobile Apps 5
T Android Studio: Einen Button in einer For Schleife verwenden Android & Cross-Platform Mobile Apps 2
K BLE Komunikation mit Android studio und esp32 Android & Cross-Platform Mobile Apps 5
G Android UDP Kommunikation Android & Cross-Platform Mobile Apps 1
M Paper DB wird in Android Studio nicht erkannt Android & Cross-Platform Mobile Apps 7
J Android zugrif auf Thread nach Handy drehen. Android & Cross-Platform Mobile Apps 10
T Android Android Augmented Faces in Java. Neue Landmarks erstellen Android & Cross-Platform Mobile Apps 1
K Android Android In-App-Purchase lädt nicht Android & Cross-Platform Mobile Apps 0
Besset Android http request an interne ip adresse funktioniert nicht Android & Cross-Platform Mobile Apps 8
J Is Android Development Head First Outdated? Android & Cross-Platform Mobile Apps 3
J Android Android Datenbankverbindung zum Raspberry Pi Android & Cross-Platform Mobile Apps 1
lolcore Android Studio -Download Documentation for Android SDK Android & Cross-Platform Mobile Apps 0
S Sinnvollste weg eine SQLite DB mit Android auslesen Android & Cross-Platform Mobile Apps 7
W Problem mit Android Studio Android & Cross-Platform Mobile Apps 0
W App Abo Android Android & Cross-Platform Mobile Apps 10
OSchriever Android Android MediaPlayer bei Anruf stoppen/pausieren Android & Cross-Platform Mobile Apps 2
OSchriever Auf onClick-Listener reagieren und Parameter übergeben (Android Studio) Android & Cross-Platform Mobile Apps 4
W removeNetwork Android App mit Spendenaktion fürs Tierheim! Android & Cross-Platform Mobile Apps 1
T Android R.string.test+i Problem Android & Cross-Platform Mobile Apps 2
P undefinierbarer Fehler Android Android & Cross-Platform Mobile Apps 8
T Android ArrayList sortieren mit 2 Werten ohne thencomparing , Wie? Android & Cross-Platform Mobile Apps 10
W Variable überschreiben (Android Studio) Android & Cross-Platform Mobile Apps 2
ruutaiokwu Android Selbst entwickelter SMTP-Client läuft auf PC, nicht aber auf Android Android & Cross-Platform Mobile Apps 9
ruutaiokwu Android Warum muss man bei Android Studio immer 2x auf "Run" klicken damit die App auf dem Gerät startet Android & Cross-Platform Mobile Apps 8
ruutaiokwu Android Wo das 'android.useAndroidX' property hinzufügen? Android & Cross-Platform Mobile Apps 8
ruutaiokwu Android In einem Android-“Spinner”-Element GLEICHZEITIG Bild (links) UND Text (rechts) anzeigen Android & Cross-Platform Mobile Apps 0
P Login und Registrierung Android Anzeige Android & Cross-Platform Mobile Apps 7
S Von JavaFx zu Android Android & Cross-Platform Mobile Apps 12
K Android to Pi | Websocket Problem Android & Cross-Platform Mobile Apps 3
ruutaiokwu Wie fügt man bei Android Studio .jar-Libraries zu einem Android-Java-Projekt hinzu? Android & Cross-Platform Mobile Apps 33
M Komponenten positionieren in Android Studio 3.6.3 Android & Cross-Platform Mobile Apps 1
M Android Studio - Property-Fenster einblenden Android & Cross-Platform Mobile Apps 1
M Android Studio - App auf dem Smartphone testen Android & Cross-Platform Mobile Apps 7
M Barrierefreie Appentwicklung für Android - Suche Codebeispiele Android & Cross-Platform Mobile Apps 8
M Android Studio - Configuration fehlt Android & Cross-Platform Mobile Apps 20
M Wo kann ich das Android SDK herunterladen / wie kann ich es installieren Android & Cross-Platform Mobile Apps 3
M Unsupported class file major version 57 - Fehlermeldung bei Android Studio Android & Cross-Platform Mobile Apps 27
ruutaiokwu Android Studio (SDK) ANDROID_SDK_ROOT-Variable? Android & Cross-Platform Mobile Apps 5
O Web API in Android (JAVA) einbinden Android & Cross-Platform Mobile Apps 3
J Android Studio macht seltsame Sachen Android & Cross-Platform Mobile Apps 2
J Android 9.1 aber android Studio findet API22 Android & Cross-Platform Mobile Apps 0
Dimax Web-Seite in native app convertieren mit Android Studio Android & Cross-Platform Mobile Apps 8
A Android Studio: while-Schleife beginnt nicht Android & Cross-Platform Mobile Apps 5
lolcore android studio: fehler bei laden des emulators Android & Cross-Platform Mobile Apps 10
J Android App - Browser öffnen und Text eingeben/Button click auslösen Android & Cross-Platform Mobile Apps 10
A Android-Studio: 2. Layout nach kurzer Zeit aufzeigen Android & Cross-Platform Mobile Apps 2
A jpg wird im Android Studio nicht akzeptiert Android & Cross-Platform Mobile Apps 3
J Android Studio - ArrayList - Selected Item ermitteln Android & Cross-Platform Mobile Apps 13
T Android SDK-Manager startet nicht in Eclipse Android & Cross-Platform Mobile Apps 5
T Bringen mir die Java-Basics irgendetwas für die Android-Programmierung Android & Cross-Platform Mobile Apps 4
J Was soll das bedeuten ? does not require android.permission.BIND_JOB_SERVICE permission Android & Cross-Platform Mobile Apps 7
A Android Studio: ImageView verpixelt Android & Cross-Platform Mobile Apps 2
J intend Service im Android Studio Android & Cross-Platform Mobile Apps 4
L Android Android Development eventuell mit Flutter Android & Cross-Platform Mobile Apps 1
S Android Layout - welchen Typ? Android & Cross-Platform Mobile Apps 3
T Fehler Android Studio: java.net.MalformedURLException: no protocol: http%3A%2F%2Fwww.mal ..... Android & Cross-Platform Mobile Apps 2
Arif Android Android Studio: Fehler beim Einbinden fremder Bibliothek? Android & Cross-Platform Mobile Apps 2
L Android Android Contacts DB auslesen Android & Cross-Platform Mobile Apps 1
A Android Studio - App mit Nearby Android & Cross-Platform Mobile Apps 1
L Android content URI Datei einlesen Android & Cross-Platform Mobile Apps 9
N Android Game Background Service Android & Cross-Platform Mobile Apps 11
Jackii Android Android Studio Error im Testlauf ohne zu programmieren Android & Cross-Platform Mobile Apps 9
B Android Probleme mit Android Studio Android & Cross-Platform Mobile Apps 6
Excess Android Service läuft nicht in Sandby weiter Android & Cross-Platform Mobile Apps 2
B Android Projekt für Android und IOS erstellen? Android & Cross-Platform Mobile Apps 5
J App funktioniert auf Android 5, auf 6 nicht Android & Cross-Platform Mobile Apps 2
J Android Snake Android & Cross-Platform Mobile Apps 15
J Android TaschenRechner Android & Cross-Platform Mobile Apps 22
I Das Problem mit der Tastatur... android:windowSoftInputMode="adjustPan" Android & Cross-Platform Mobile Apps 1
E Wie erhalte ich Zugriff auf das Microfon? (Android Studio) Android & Cross-Platform Mobile Apps 9
C Android Programmierung speziell oder einfach Java Buch kaufen? Android & Cross-Platform Mobile Apps 3
B Android Kein Zugriff auf Telefonspeicher (Android 6) Android & Cross-Platform Mobile Apps 1
T Android Equalizer für Android Android & Cross-Platform Mobile Apps 3
L Android Android Studio - Exportierte APK funktioniert nicht Android & Cross-Platform Mobile Apps 6
L Android Methode funktioniert nicht unter Android Android & Cross-Platform Mobile Apps 3
A Beginnen mit Serverkommunikatsion in Android Studio Android & Cross-Platform Mobile Apps 6
E Android Studio Android & Cross-Platform Mobile Apps 15
L Android Android Studio Setup killt Explorer Android & Cross-Platform Mobile Apps 3
K Android Videos rendern Android & Cross-Platform Mobile Apps 1
J Variable in strings.xml (Android Studio) Android & Cross-Platform Mobile Apps 0
B Android Android Studio lässt PC abstürzen Android & Cross-Platform Mobile Apps 3
B Android App Fehler Android & Cross-Platform Mobile Apps 21
J android Spinner funktioniert nicht Android & Cross-Platform Mobile Apps 14

Ähnliche Java Themen

Neue Themen


Oben