German Problem mit Activitys

mw71

Active Member
Licensed User
Longtime User
Hallöchen,

ich hab ein kleines Problem mit den Activitys. Grundsätzlich arbeite ich mit 1er Activity (Main).

Nun habe ich mir eine 2te Activity (Noti_Meldung) in das Projekt eingebaut. Der Nutzer kann nun normal mit der APP in der Main Activity Arbeiten. Kommt nun eine Notification kann der Nutzer auf diese Klicken und es öffnet sich die 2te Activiy (macht nix weiter als eine Meldung auszugeben). Wenn diese fertig ist wird die alte Activity (Main) mit StartActivity(Main) gestartet und die 2te (Noti_Meldung) mit Activity.Finish geschlossen.

Soweit funktioniert das auch, nur lande ich in der Main Activity immer wieder ganz vorn (logisch, wird ja neu gestartet). Mein Problem ist nun das ich gerne wieder an die Stelle in der Main Activity möchte an der ich war bevor die 2te Activity gestartet wurde. Ist dies irgendwie sinnvoll möglich??

Danke
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Hallo mw71,

so wie die Frage gestellt wurde, gehe ich davon aus, dass die erste Activity größer ist als der sichtbare Touchscreen.

Gibt es dort eine ScrollView oder sind dort mehrere Panels vorhanden ... oder was ist genau oder was ist genau gemeint mit "lande wieder ganz vorne"?
 

mw71

Active Member
Licensed User
Longtime User
Gibt es dort eine ScrollView oder sind dort mehrere Panels vorhanden ...

Es gibt mehrere Panels mit denen ich Arbeite (diese enthalten z.T. auch ScrollViews)

oder was ist genau oder was ist genau gemeint mit "lande wieder ganz vorne"?

Durch den Befehl StartActivity(Main) wird die erste Activity komplett neu gestartet, so als ob ich die APP das 1te mal aufrufe (also Sub Activity_Create.....).
Ich möchte aber gerne wenigstens auf das zuletzt genutzte Panel zurückkehren.

Grüße
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Das geht z.B. mit ...

Panel1.Visible = True
Panel1.BringToFront


oder bei einer ScrollView ...

ScrollView.Position = 0

bei EditText ...

EditText1.RequestFocus
 

mw71

Active Member
Licensed User
Longtime User
Bitte nicht falsch verstehen, aber wie ich die Panels u.s.w. Handle ist mit bewusst, das muss ich ja auch reichlich machen damit die App macht was sie soll.

Mein Problem ist das ich nicht weiß wo er gerade in der Main Activity war (also z.B. auf welchem Panel) wenn die 2te Activity aufgerufen wird (die wird ja durch die Notification gestartet).
Ich habe auch im Moment keine Idee/Ahnung wie ich das Schließen der Activity durch den Aufruf der 2ten Activity abfangen kann (sonnst könnte man das ja irgendwo speichern, z.B. über den StateManager oder was eigenes)
 

mw71

Active Member
Licensed User
Longtime User
Hallo Klaus,

die Idee hört sich sehr gut an, mein Problem ist die Umsetzung, vielleicht hast du da noch einen Tipp?
Im Moment mache ich das so:

B4X:
     Dim n As Notification

    N.Initialize
    n.Icon="logo" 'use the application icon file for the notification
    n.Sound=False
    n.Vibrate=False
    n.SetInfo2(Titel_Short,Text_Short,"Notification_Tag<>" & Text_Big,Noti_Meldung)
'Titel_Short -> Titel
'Text_Short -> Text
'Text_Big -> Text, nur ausfühlicher
'Noti_Meldung -> die 2te Activity
 
    If Number>0 Then
        n.Notify(Number)
    Else
        n.Notify(1)
    End If

in der 2ten Activity mache ich dann folgendes:
B4X:
Sub Activity_Create(FirstTime As Boolean)

panel0.Initialize("") : panel0.Visible = True
Activity.AddView(panel0, 0, 0, 100%x, 100%y)
panel0.LoadLayout("leer")

End Sub

Sub Activity_Resume
    Dim in As Intent
    in = Activity.GetStartingIntent
    Dim split() As String = Regex.Split("<>",in.GetExtra("Notification_Tag")) 
    If split(0) ="Notification_Tag" And split.Length > 0 Then Msgbox(split(1), "Notif...")
 
    StartActivity(Main)
    Activity.Finish 
 
End Sub
 

An Schi

Well-Known Member
Licensed User
Wenn du die erste activity nicht neu startest, sondern nur die zweite schließt , müsste die erste dann nicht unter der zweiten unverändert bestehen bleiben?
(bin nicht am PC, ist also geraten)
 

mw71

Active Member
Licensed User
Longtime User
n.SetInfo2.... sagt der Notification das sie die 2te Activity starten soll wenn auf sie (die Notification) geklickt wird.

Gruß
 

klaus

Expert
Licensed User
Longtime User
Da ich noch nie mit Notifications gearbeitet hatte musste ich erst ein bisschen lernen.
Habe ein kleines Testprogramm geschrieben zum Verstehen und Testen.
Mein Vorschlag mit einem Panel geht leider nicht.
Der Vorschlag von As Schi, StartActivity(Main) raus zu nehmen, funktioniert.
Dann habe ich versucht, anstatt einer neuen Activity, die gleiche anzugeben und habe
n.SetInfo2("Notification" & Number, "TestText", "Note1", Test)
durch
n.SetInfo2("Notification" & Number, "TestText", "Note1", Me)
ersetzt, das heisst, ein Klick in der Notification geht direkt an deine Activity 1 zurück.
Das funktioniert auch.
Wenn man einen Text in die EditText View eingibt und die ScrollView scrollt, bleibt alles wie es war wenn man von der Notification zurück kommt.
Das einzige Problem könnte sein, wenn die Zeit zwischen der Sendung der Notification und dem Click auf die Notification lang ist, dass das Betriebsystem dann die Activity in den Hintergrund (paused) setzt, dann weiss ich nicht ob die Activity so bleibt wie sie war

Beiliegend mein Testprogramm.

Aber noch eine Frage. Wozu brauchst du die Notifications?
Arbeitet das Programm im Hintergrund und die Notifications geben dem Benutzer Notiz dass etwas passiert ist.
Denn wenn das Programm aktiv ist, würde da eine MessageBox nicht genügen?
 

Attachments

  • Notification.zip
    9.6 KB · Views: 216
Last edited:

mw71

Active Member
Licensed User
Longtime User
Beiliegend mein Testprogramm.
Danke, werde ich mir mal ansehen.

Aber noch eine Frage. Wozu brauchst du die Notifications?
Arbeitet das Programm im Hintergrund und die Notifications geben dem Benutzer Notiz dass etwas passiert ist.
Denn wenn das Programm aktiv ist, würde da eine MessageBox nicht genügen?

Ja und grundsätzlich Ja.
- z.B. das Backup kann im Hintergrund laufen (StartServiceAt....), da MUSS eine Notification kommen, da das Programm im Normalfall nicht aktiv ist oder sonnst
ungeplant unterbrochen werden könnte.

- an anderen Stellen, wie z.B. dem Export ist das sicherlich nicht unbedingt nötig (da diese Sachen der Nutzer aktiv auslöst) , da es aber eine kleine Übung ist gebe ich dort zusätzlich zur MsgBox noch eine Notif. mit aus.


Vielleicht noch zur Info wieso ich die Meldung des Notif. auf Anforderung noch mal als MsgBox ausgeben möchte. Ich nutze die NotificationBuilder Libary wegen der Möglichkeit Multiline Messages auszugeben. Leider sieht man unter Umständen den Inhalt nicht (weißes Feld) und da möchte ich dies gerne als Rückfallebene einbauen.

Grüße
 

mw71

Active Member
Licensed User
Longtime User
Hallo Klaus,

hab mir dein Programm angesehen. Das es den NotificationListener nutzt gefällt mir nicht so richtig, aber es hat mich einer Lösung sehr nahe (bzw. zur Lösung) gebracht.
In der Activity_Resume steht jetzt (u.a.)
B4X:
'Abfrage ob Meldung vom Notif.
    Dim varIntent As Intent
    varIntent = Activity.GetStartingIntent
    Log("Notification Tag: " & varIntent.GetExtra("Notification_Tag"))
    Dim split() As String = Regex.Split("<>",varIntent.GetExtra("Notification_Tag"))
    If split.Length >= 0 Then
        If split(0) ="Notification_Tag" And split.Length >0 Then
'            Panel1.Visible=True
            Msgbox(split(1), "Notif...")
        End If
    End If

davor werden die Panels wieder geladen, danach der ganze Rest, scheint erst mal recht brauchbar zu funktionieren.

Der "Aufruf" erfolgt über n.SetInfo2("Notification" & Number, "TestText", "Note1", Me)

Danke & Grüße
 

mw71

Active Member
Licensed User
Longtime User
Was benutz Du?
dein Projekt nutzt den NOTIFICATION_LISTENER (siehe Manifest und z.B. In.Initialize("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS", "")

Zum einen wieder ein Recht mehr was die App braucht, zum anderen hatte ich auf die schnelle Probleme damit (hebe aber nicht weiter gesucht).
Daher verwende ich in nicht.

Grüße
 
Top