Activity aus einem BroadcastReceiver "OnReceive" heraus starten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Activity aus einem BroadcastReceiver "OnReceive" heraus starten

    Hallo,

    folgende Situation:
    - ich benutze Android-Studio mit Emulator..

    - die HauptActivity, ...MAIN, ...LAUNCHER ist zur Einstellung der Parameter.
    - es ist eine zweite Activity enthalten, welche ein "OK-Dialog" darstellt.
    - in der AndroidManifest.xml ist ein BroadcastReceiver registriert, er reagiert auf einkommende SMS und wertet diese aus.

    Der BroadcastReceiver läuft und reagiert richtig. Passt der SMS-Text mit dem eingestelltem Kennwort überein, soll die zweite Activity angezeigt werden.
    Testweise spiele ich auch ein Ton ab. Der Ton ist immer zu hören.
    Auch, wie erwartet nach einem Neustart des Handys.


    Die "zweite Activity" wird nur angezeigt, so lange die HauptActivity angezeigt wird.
    Ist die HauptActivity aktiv, wird die 2. korrekt angezeigt, ist sie im Hintergrund oder beendet, wird die zweite Activity nicht angezeigt.

    Ausschnitt aus der AndroidManifest.XML

    Quellcode

    1. <receiver android:name=".SMSReceiver"
    2. android:enabled="true"
    3. android:exported="true"
    4. android:permission="android.permission.BROADCAST_SMS">
    5. <intent-filter android:priority="2147483647" >
    6. <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    7. </intent-filter>
    8. </receiver>
    9. <activity android:name=".SecondActivity" android:launchMode="singleTop" />
    10. <activity android:name=".MainActivity" android:launchMode="singleTop">
    11. <intent-filter>
    12. <action android:name="android.intent.action.MAIN" />
    13. <category android:name="android.intent.category.LAUNCHER" />
    14. </intent-filter>
    15. </activity>
    Alles anzeigen


    Ausschnitt aus dem BroadcastReceiver:

    Quellcode

    1. public void onReceive(Context context, Intent intent) {
    2. ... Auswertung der SMS ...
    3. // Start der zweiten Activity
    4. Intent showDialog = new Intent();
    5. showDialog.setClassName(SecondActivity.class.getPackage().getName(),SecondActivity.class.getName());
    6. showDialog.setAction(Intent.ACTION_VIEW);
    7. showDialog.addCategory(Intent.CATEGORY_LAUNCHER);
    8. showDialog.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
    9. context.startActivity(showDialog);
    10. ...
    11. }
    Alles anzeigen
    a) Wieso nicht ?
    b) Wie bekomme ich die zweite Activity aus dem Receiver heraus angezeigt?

    beste Grüße Mario

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von MarioR ()

  • ... okay problem ist gelöst (fast) ...

    Ich hab noch mal ein bissl herumgestöbert und ein paar Anleitungen gelesen und nun ist es klar und rennt ;)

    Folgende Erkenntnisse:

    - ein BroadCastReceiver (BCR) kann keine Activity starten
    - ein BCR soll nur kurze Abläufe ohne großen Speicherzugriff ausführen
    - ein BroadCastReceiver kann einen Service starten
    - ... aber auch ein Service, der nicht von einer Activity gestartet wurde, kann keine Activity starten
    - eine Notification kann aber angezeigt werden
    - eine Notification kann Aktionen auslösen

    Daraus entstand folgendes Konstrukt:

    - in der AndroidManifest.XML wird zusätzlich Service eingefügt

    XML-Quellcode

    1. <service android:name=".BellMyPhoneService" />



    - In dem BCR, der auf die eingehende SMS reagiert, wird ein neuer Intent erstellt, in diesen werden die SMS-Daten (getExtras()) reingepackt und damit der Service gestartet:

    Java-Quellcode

    1. public class SMSReceiver extends BroadcastReceiver {
    2. /**
    3. * Event bei Empfang einer SMS den Service starten
    4. * @param context
    5. * @param intent
    6. */
    7. @Override
    8. public void onReceive(Context context, Intent intent) {
    9. Intent iStartServive = new Intent(context, BellMyPhoneService.class);
    10. iStartServive.setAction(BellMyPhoneApp.ACTION_START_SMSCASTSERVICE);
    11. // die SMS in den StarteService-Intent legen
    12. iStartServive.putExtras(intent.getExtras());
    13. context.startService(iStartServive);
    14. }
    Alles anzeigen

    - Im Service erfolgt die Verarbeitung der SMS und auch das Starten der Notification
    In der Notification kann per Action "OKAY" ein Event gesendet werden, auf das reagiert der Service und beendet sich selbst.
    Alternativ kann eine weitere SMS mit einem "StopCode" gesendet werden, auch dadurch beendet sich der Service.

    Problem ist derzeit nur: Wie bekomme ich die Notification aus dem Service als "Head Up" / "Pop up" -Message (wie die Mitteilung "Neue SMS") angezeigt.
    Derzeit wird die als "silent message" angezeigt:

    Java-Quellcode

    1. /**
    2. * Your Have Find Me - Dialog anzeigen
    3. */
    4. private void showNotification() {
    5. String chanelId = createNotificationChanel();
    6. // Event für SoundPlayerStop
    7. Intent iStopSound = new Intent();
    8. iStopSound.setAction(BellMyPhoneApp.ACTION_FOR_STOP_SOUND_PLAYER);
    9. PendingIntent piStopSound = PendingIntent.getBroadcast(this, 0, iStopSound, 0);
    10. // Notification erzeugen
    11. Intent iFullScreen = new Intent(this, BellMyPhoneService.class);
    12. iFullScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    13. PendingIntent piFullScreen = PendingIntent.getActivity(this, 0, iFullScreen, PendingIntent.FLAG_UPDATE_CURRENT);
    14. NotificationCompat.Builder nbShowDialog = new NotificationCompat.Builder(this, chanelId)
    15. .setDefaults(NotificationCompat.DEFAULT_ALL)
    16. .setNumber(BellMyPhoneApp.NOTIFICATION_ID)
    17. .setSmallIcon(R.drawable.ic_launcher_foreground)
    18. .setContentTitle(getResources().getString(R.string.strvalue_app_name))
    19. .setContentIntent(piFullScreen)
    20. .setContentText(getResources().getString(R.string.strvalue_foundme_txt))
    21. .addAction(0, getResources().getString(R.string.strvalue_okay_txt),piStopSound)
    22. .setPriority(NotificationCompat.PRIORITY_HIGH)
    23. //.setFullScreenIntent(piFullScreen, true)
    24. .setAutoCancel(true);
    25. if (bellSeconds > 0) {
    26. nbShowDialog.setProgress(bellSeconds,0,false);
    27. }
    28. Notification nShowDialog = nbShowDialog.build();
    29. startForeground(BellMyPhoneApp.NOTIFICATION_ID, nShowDialog);
    30. stopForeground(false);
    31. }
    32. /**
    33. * erzeugt den NotificationChannel
    34. */
    35. private String createNotificationChanel(){
    36. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
    37. {
    38. NotificationChannel notiChan = new NotificationChannel(
    39. BellMyPhoneApp.CHANNEL_ID, BellMyPhoneApp.APP_NAME, NotificationManager.IMPORTANCE_HIGHT
    40. );
    41. notiChan.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
    42. notiChan.enableLights(true);
    43. notiChan.setLightColor(Color.YELLOW);
    44. notiChan.setDescription(getResources().getString(R.string.strvalue_chanel_descript));
    45. NotificationManager nManager = getSystemService(NotificationManager.class);
    46. nManager.createNotificationChannel((notiChan));
    47. return BellMyPhoneApp.CHANNEL_ID;
    48. }
    49. return "";
    50. }
    Alles anzeigen

    Alle Versuche, mit denen im Netz gefundenen Hinweise sind fehlgeschlagen, die Notification "popt nicht auf" ...

    Hab ich da was übersehen?

    Gruß Mario
  • ... onStartCommand im Service

    Quellcode

    1. /**
    2. * Aufruf der Servcice-Aktion
    3. *
    4. * @param intent
    5. * @param flags
    6. * @param startId
    7. * @return
    8. */
    9. @Override
    10. public int onStartCommand(Intent intent, int flags, int startId) {
    11. if ((intent != null) && (intent.getAction() != null)) {
    12. if (intent.getAction().equals(BellMyPhoneApp.ACTION_START_SMSCASTSERVICE)) {
    13. checkSMS(intent);
    14. }
    15. }
    16. return START_NOT_STICKY;
    17. }
    Alles anzeigen
    .. ^^