Activity aus von anderer class starten und aktive beenden. Wie möglich?

  • Antworten:5
DmanT
  • Forum-Beiträge: 36

17.02.2018, 04:55:49 via Website

Hallo,

ich suche eine Möglichkeit eine Activity von einer anderen Klasse aus zu starten. Leider ohne Erfolg.

Dank Onkel google fand ich dann eine Möglichkeit mittels

((Activity)...

Leider funktioniert dies nicht. Ich probierte folgendes:

Intent intent = new Intent(Constants.context, MainActivity2.class);
((MainActivity)Constants.context).startActivity(intent);
((MainActivity)Constants.context).finish();

Leider ohne Erfolg.

Constants.context habe ich in einer anderen Datei (Constants.class)

public class Constants extends AppCompatActivity {
static Context context;
}

in der MainActivitiy.class setze ich sofort nach dem onCreate

Constants.context = getApplicationContext();

in einer dritten Datei möchte ich nun eine Methode aufrufen die dann eine neue Activity öffnet und die MainActivity mit finish() schließt. Leider also z.b. so:

Class3.openNewActivity();

in der Datei Class3 würde dann in der Methode openNewActivity() der Intent code stehen, leider bekomme ich es einfach nicht hin. Was mache ich falsch?

Im Log bekomme ich folgendes:

02-17 04:58:48.645 14687-14687/XXXXXXXXXX E/AndroidRuntime: FATAL EXCEPTION: main
                                                                           Process: XXXXXXXXXX, PID: 14687
                                                                           java.lang.ClassCastException: android.app.Application cannot be cast to XXXXXXXXXX.MainActivity

— geändert am 17.02.2018, 05:00:28

Kommentieren
swa00
  • Forum-Beiträge: 3.704

17.02.2018, 07:23:25 via Website

Moin :

Vorweg : Ein Simples

Intent mainIntent = new Intent(this,  MainActivity2.class);
startActivity(mainIntent);

reicht in Deinem Falle völlig aus.

a) Du fügst uns keinen Errorlog bei - Der ist essentiell , um dir helfen zu können.
b) Ist die zweite Activity denn in der Manifest eingetragen ?
c) Woher beruht deine "Constants" ? - Diesen Source verschweigst du :-)
Da ich auch hauptberuflich aus der C/C++ Ecke komme, vermute ich , dass dies eine einfache
statische Klasse ist, die du global als ParameterPool verwendest.

Das geht unter Android so NICHT.
Dazu sollte man z.b. mit Singleton/Application arbeiten. (siehe auch unten)

d) Hiermit klaust du dir den Context, den du aus der Mainactivity geholt hast und
warum castest du in dem Moment ?

((MainActivity)Constants.context).finish();

Das geht in der Regel schief
..
< --------------------------------------------------------------------------------------------------- >
Wichtig zu deinem Verständnis :

a) Wenn du aus der C Ecke kommst , musst du komplett umdenken .
Du kannst nicht einfach etwas beenden und gut ist (finish())
Schau dir mal dazu LifeCycle und GC an.

b) Parameter kann man nicht einfach global klassenübergreifend deklarieren und hoffen, dass sie
während der Runtime immer den gleichen Wert besitzen !
Android kann/wird dir zur Laufzeit diesen Speicher freimachen OHNE dich zu informieren.
(Da ist auch so gewollt)

Dazu benötigst zu zwingend passende Instanzen :
https://github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class
https://stackoverflow.com/questions/16517702/singleton-in-android

c) Rücke ein wenig von deinen Logs ab : Arbeite lieber mit dem LogCat / Errorlog und Step by Step debugging - Diese geben Dir i.d.R sehr gut aus , was schief läuft.

d) Binde grundsätzlich alles in einen try / catch Block ein und gib die Exception aus
Eigene Log-Ausgaben nur bei Runtime-Fortschritt verwenden , NICHT für das Debugging.
(Ich beziehe mich auf deinen anderen Thread von heute Morgen )

— geändert am 17.02.2018, 09:26:29

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Pascal P.
Kommentieren
DmanT
  • Forum-Beiträge: 36

17.02.2018, 10:20:19 via Website

So, also ein einfaches startActivity hilft mir hier nicht weiter.

Du wirst vermutlich die Hände über dem Kopf zusammenschlagen aber ok. Habe den Code mal mit einem Syntaxhighlighting gepostet dann ist es vielleicht etwas übersichtlicher.

Hier mal ein paar Dateien des Projekts. Also überwiegend speichere ich alles in Preferences. Die variablen brauche ich nur mal kurzzeitig von einer in einer anderen Klasse. Ob diese dann gelöscht wird ist egal. Zur Zugriffszeit wird die ja nicht gelöscht, also ClassA => Daten Rein, ClassXYZ => Daten raus und verarbeiten. Danach kann mit den Daten passieren was will. Das war so die anfanglichste Hürde die ich mit Android (Java) hatte und naja, das hat bisher so immer geklappt also beibehalten. Also habe ich so meinen eigenen Style was das "logging" angeht, jedoch, wenn ich es dir erkläre, sagte, stimmt hast recht anstatt zu sagen, "da würde ich selber nicht durchblicken".

Wie dem auch sei, hier mal die Files

MainActivity.java
Constants.java
Login.java

Das läuft auch alles super durch, bis es nun zum starten der neuen Activity geht.

Hier mal den Codesnippet dazu

HTTPConnection snippet

Und hier soll die Activity nun gestartet werden. Das geht nicht mit this o.ä. da müssen schon andere "Kaliber" her. Wohlmöglich lässt sich der komplette Code fast vollständig überarbeiten aber das lassen wir jetzt erst einmal aussen vor. Ich habe da so meine Art.

Mein Chef sagt immer, wenn ich das Unternehmen mal verlasse muss jede Software erneut programmiert werden weil kaum jemand durch meinen Codestyle durchblickt.

Ich hoffe jetzt ist das ein wenig Verständlicher.

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

17.02.2018, 10:48:13 via App

Dein Codestyle ist in der Tat etwas eigen. Zudem hälst du wie gesagt nicht die Standards ein die man heutzutage hat. Für ein Unternehmen würde ich es mich nicht getrauen so zu proggen (bitte nicht persönlich nehmen...)

Im Normalfall hat man einen AsyncTask der die UrlConnection und die Reapinse behandelt. Wenn die Daten da sind, wird ein Callback in die Activitiy ausgeführt, wo die Daten gebraucht werden. Wenn du das so umsetzt, dann fällt dieses Problem auch raus, denn dann bist zu wieder im Context der MainActivity und kannst dann da deinen Intent starten und mit Intent#putExtras deine Daten mitgeben

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
swa00
Kommentieren
Rafael K.
  • Forum-Beiträge: 2.359

17.02.2018, 11:24:01 via Website

Es gibt so viele Demo Projekte von Google, und zu jeder Library idR eine hervorragende Sample-App wo man Quellcode (und damit auch gängige Java Patterns) kopieren kann.
Zu jeder gängigen Frage findest du bei StackOverflow gute Code-Snippets.
Tue dir selbst einen Gefallen und beschäftige dich etwas damit. Speziell, wenn du die App wirklich mal in den Store bringen willst, wird sie dir in diesem Zustand ständig um die Ohren fliegen und du wirst Fehler haben, die extrem schwer zu debuggen sind.

Was man unter Java und speziell und Android vermeiden sollte ist die Nutzung von static Variablen und das willkürliche Teilen von Daten zwischen Klassen (Stichwort Kapsellung) . In dem Code ist ja quasi alles static und Klassen greifen gegenseitig auf ihre Felder zu.
Damit wirst du dir garantiert Speicherlöcher, Seiteneffekte und noch viel mehr Spaß einfangen. "You're entering a world of pain".

Es gibt Standard-Ansätze für das alles. z.B. erbt jede Activity von Context, daher musst du nirgendwo einen zentralen Context speichern. Views innerhalb einer Activity gehören der Instanz (und es kann mehrere geben), daher sollten sie NIE static sein. Schau dir z.B. mal Butterknife an, um die Views zu verwalten.
Der Austausch von Daten zwischen Activities geht über Intents. HttpClients haben Callbacks (z.B. OkHttp3 oder Retrofit sind hervorragend).

Und und und...so wie das jetzt ist, wirst du hier noch in Wochen Folgefragen mit uns diskutieren, die nur daher rühren, dass die Basis schon kaputt ist.

Hilfreich?
Pascal P.swa00
Kommentieren
swa00
  • Forum-Beiträge: 3.704

17.02.2018, 11:26:50 via Website

Und und und...so wie das jetzt ist, wirst du hier noch in Wochen Folgefragen mit uns diskutieren, die nur daher rühren, dass die Basis schon kaputt ist.

Das hatte ich mich nicht getraut, oben so zu schreiben, aber es trifft den Kern :-)
Irgendwie habe ich auch das Gefühl , dass er gut gemeinte Hinweise ( auch im anderen Thread) nicht so ernst nimmt und eher "ignoriert" :-)
(Vielmehr wegdiskutiert)

— geändert am 17.02.2018, 11:40:33

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Kommentieren