Activity im Vordergrund beenden?

  • Antworten:11
  • OffenNicht stickyNicht beantwortet

08.08.2012 11:00:29 via Website

Hi Leute,

ich hätte mal eine Frage und zwar bin ich daran eine App zu entwickeln, die von einem Server eine url bekommt, wo diverse Streams laufen. Wenn ich nun den Stream erhalten habe, starte ich momentan den VLC-Player über einen Intent.

1Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(Main.channel_activ.geturl()));
2 startActivity(in);

Nun muss ich jedoch auf Änderungen reagieren können z.B. wenn der Server meldet, dass er einen neuen Sender "antuned" muss ich die Activity des VLC wieder beenden und mit der neuen URL starten, da ansonsten das Bild des VLC-Players einfriert. Da ich ja die Activity aus meiner App heraus starte müsste es rein "rechtlich" ja möglich sein, den Prozess auch zu beenden oder? Aber wie beende ich den Prozess wenn er im Vordergrund ist?

Hoff ihr hab ne Lösung dafür parat :)

PS: Es ist ja nicht mehr möglich Activities anderer Apps in die eigene View einzubauen oder? Weil in einem anderen Forum meinte ein User das es unter 2.3 bei ihm funktionieren würde. Wenn ich dessen Zeilen probiere bringt er mir jedoch nur eine SECURITY_EXCEPTION das ein Prozess mit der UID XXXX einen Prozess mit der UID YYYY starten möchte und das verboten sei...

Danke schonma ;)

08.08.2012 11:25:29 via Website

Hi ich nochma :D

Ich hab jetzt herausgefunden das man das ganze ja über startActivityForResult(Intent, Int) lösen könnte. Wenn ich nun finishActivity(Int) mache wird der VLC-Player auch beendet. Das doofe ist nur das der "Clientserver" bei mir in der Main läuft die Activity jedoch durch die ViewList gestartet wird. Wenn ich jetzt in der Main finishActivity(Int) mache kennt er es natürlich nicht. Wie komme ich an die Instanz der gestarteten ViewList? un dann instanz.finishActivity(Int) machen kann?

08.08.2012 21:13:17 via Website

Ja ich versteh dich mir würde es wohl genauso ergehen ^.^ Code kann ich leider keinen posten zwecks Betriebsgeheimnis bei meinem Arbeitgeber... Aber so grob lässt sich das Problem schon beschreiben ;)



Also ich hab die MainActivity welche einen Service startet der quasie ein "ClientServer" ist. Soll einfach verdeutlichen das ich einen ServerSocket auf dem Client starte und Nachrichten empfangen kann. Die ListView ist eine andere Activity die mir die Liste der Sender darstellt. Wenn ich dann auf einen Eintrag klicke wird ein Intent gestartet der den VLC-Player öffnet. Nun soll der Service jedoch in der Lage sein diese Activity (VLC-Player) auch beenden zu können damit ich auf Senderwechsel eben reagieren kann. Jetzt habe ich heute probiert in der Main eine static Variable von einer Activity anzulegen. Wenn dann die ViewList erstellt wird, habe ich einfach Main.VARIABLE = this; gemacht. Ich weis das mit static ist pfusch aber ich wollts einfach mal zum laufen kriegen... Selbst wenn ich nun Main.VARIABLE.finishActivity(Int) im Service mache beendet sich die Activity nicht. Wenn ich jedoch in der ViewList Activity das finishActivity(Int) ausführe funktioniert es wunderbar was mir aber nichts bringt :)

Hoff ich konnt das Szenario nun deutlicher beschreiben.

Gelöschter Account

09.08.2012 11:31:50 via Website

Was in dem Design fehlt ist die zentrale Instanz. Irgendeine Activity öffnet etwas was eine andere wieder schließen soll. Ich denke Du musst Dir diese zentrale Instanz bauen:

1.) Das könnte eine abgeleitete Application (MyApplication) sein.

2.) Das könnte Dein "ClientServer" sein. Eine beliebige Activity schickt ihm den "Broadcast" zum Öffnen des VLC, er selbst verwaltet den VLC beim Senderwechsel und mit anderen "Broadcasts" kann von jedem das Schließen veranlasst werden.

Ich favorisiere #2.

09.08.2012 11:37:51 via Website

Vielen Dank sowas in die Richtung habe ich mir auch gedacht nur konnte ich es nicht in einen Satz bzw. konkreten Gedanken packen (#2). Vielen Dank an dieser Stelle hast mir wirklich sehr geholfen.

— geändert am 09.08.2012 11:38:15

13.08.2012 17:02:15 via Website

Jetzt hab ich nur wiederum ein Problem -.-' Ich hab mir den Service erweitert, dass er Messages von allen Views erstellen kann. Das senden der Senderid an den Service funktioniert auch super. Das Problem ist nur das ein Service keine startActivityForResult() besitzt. Wie also kann ich das Problem lösen, dass ich die Activity auch wieder durch den Service beenden kann?

13.08.2012 20:42:03 via Website

Ja es geht um den VLC. Das Ding ist halt ich geb dem VLC nen Stream und der spielt ihn ab. Wenn ich nun den Sender wechsel bekommt das nun mein Service schon mit. Nur kann ich ja nicht finish() für die VLC-Player Activity aufrufen damit der Stream unterbrochen wird... Oh man die ganzen Probleme hätte ich nicht wenn ich den Player selber programmieren würde nur leider fehlen mir dazu die Kenntnisse :( Der VLC-Player ist der einzige Player den ich gefunden habe der auch wirklich die UDP-Streams richtig darstellen kann...

14.08.2012 10:27:56 via Website

Ich habs hinbekommen :) Ich habe das Design insofern geändert, dass ich die Main als zentralen Punkt zum starten angesetzt habe. Meine ViewList setzt die Nachricht ab und sendet bei einer erfolgreichen Bestätigung eine Broadcast-Nachricht ab. Diese fängt die Main und startet den Stream. Wenn mein Service eine Nachricht empfängt setzt dieser ebenso eine Broadcast-Nachricht ab das der Sender gewechselt wurde und die Main beendet den Stream und startet den neuen...

Nochmal herzlichen Dank an dieser Stelle für deine Idee!

14.08.2012 13:31:46 via Website

Noch ne Frage: Hast du irgendeine Idee wie ich die Signalstärke der WLAN-Verbindung überprüfen kann? Hatte eigentlich gehoft das es sowas wie nen Intent gibt der ähnliche wie bei LOW_BATTERY geworfen wird wenn das WLAN-Signal schlecht ist. Problem ist, dass der VLC-Player den Stream einfriert wenn man aus der Reichweite heraus geht. Natürlich startet sich der Stream dann nicht mehr :angry: Wäre halt gut das irg. davor abzufangen. Sprich WLAN_BAD -> VLC beenden und Hinweis zeigen -> WLAN_GOOD -> VLC wieder starten.