PreferenceActivity wird direkt nach aktivierung ausgeblendet

  • Antworten:8
  • Bentwortet
Martin Weißhaupt
  • Forum-Beiträge: 75

07.02.2010, 13:20:07 via Website

Hallo,

ich habe schon wieder eine Frage ;-)

Und zwar lese ich das Buch "Android - Grundlagen der Entwicklung", in diesem wird beschrieben, wie man einen Bildschirm zur Bearbeitung der Einstellungen aus der XML-Datei erzeugt.

Das klappt so weit ganz gut, nur dummerweise wird der Dialog direkt nach dem Aufruf wieder geschlossen.

Android Maifest:
1<activity
2 android:name=".CMDBSettings"
3 android:label="@string/preferences"
4 />

Aufruf im Optionsmenü:
1case R.id.menu_settings:
2 {
3 Intent settingsIntent = new Intent(getApplicationContext(), CMDBSettings.class);
4 startActivity(settingsIntent);
5 return true;
6 }

Meine PreferenceActivity:
1package eu.primescale.primecmdb;
2
3import android.content.ContextWrapper;
4import android.content.SharedPreferences;
5import android.os.Bundle;
6import android.preference.PreferenceActivity;
7import android.view.Menu;
8
9
10/**
11 *
12 * @author mw88
13 */
14public class CMDBSettings extends PreferenceActivity
15{
16 @Override
17 public void onCreate(Bundle savedInstanceState)
18 {
19 super.onCreate(savedInstanceState);
20 this.addPreferencesFromResource(R.xml.cmdb_cfg);
21 }
22
23 /**
24 * Returns settings
25 *
26 * @param ctx
27 * @return
28 */
29 public static final SharedPreferences getSettings(ContextWrapper ctx)
30 {
31 return ctx.getSharedPreferences(ctx.getPackageName()+"_preferences", 0);
32 }
33
34 @Override
35 protected void onSaveInstanceState(Bundle outState)
36 {
37 super.onSaveInstanceState(outState);
38 SharedPreferences settings = getSharedPreferences(CMDBSettings.class.getSimpleName(), 0);
39 SharedPreferences.Editor editor = settings.edit();
40
41 editor.commit();
42 }
43}

Hat jemand eine Idee woran das liegen könnte?

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

07.02.2010, 15:49:48 via Website

Der Code sieht fast ok aus, daher tippe Ich auf ein Problem im XML da mir bekannt ist das die PreferencesActivity hier ein wenig "sensibel" ist.

Wieso speicherst du den Preferrences nochmal ? Soweit Ich das weiß tut die PreferencesActivity das längst.


Der Code sollte überflüssig sein:

1@Override
235 protected void onSaveInstanceState(Bundle outState)
336 {
437 super.onSaveInstanceState(outState);
538 SharedPreferences settings = getSharedPreferences(CMDBSettings.class.getSimpleName(), 0);
639 SharedPreferences.Editor editor = settings.edit();
740
841 editor.commit();

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Martin Weißhaupt
  • Forum-Beiträge: 75

07.02.2010, 17:29:51 via Website

Danke für den Hinweis, ich habe den unnötigen Code entfernt.

Mir ist aufgefallen, dass sich dieses eigenartige Verhalten nicht nur auf die PreferenceActivity beschränkt, auch eine ListActivity, die ich aufgerufen habe zeigt das gleiche Verhalten.

Edit: ich habe mich mal mit dem Debugger beschäftigt...
1I/ActivityManager( 68): Displayed activity eu.primescale.primecmdb/.gui.CMDBSettings: 473 ms
2
3I/AndroidRuntime(14742): AndroidRuntime onExit calling exit(-1)
4
5I/ActivityManager( 68): Process eu.primescale.primecmdb (pid 14742) has died.
6
7I/WindowManager( 68): WIN DEATH: Window{43ab2070 eu.primescale.primecmdb/eu.primescale.primecmdb.gui.PrimeCMDB paused=false}
8
9I/WindowManager( 68): WIN DEATH: Window{4392c600 eu.primescale.primecmdb/eu.primescale.primecmdb.gui.CMDBSettings paused=false}
10
11D/Zygote ( 36): Process 14742 exited cleanly (255)
12
13I/ActivityManager( 68): Start proc eu.primescale.primecmdb for activity eu.primescale.primecmdb/.gui.PrimeCMDB: pid=14753 uid=10094 gids={}
14
15I/dalvikvm(14753): Debugger thread not active, ignoring DDM send (t=0x41504e4d l=38)
16
17I/dalvikvm(14753): Debugger thread not active, ignoring DDM send (t=0x41504e4d l=50)
18
19W/InputManagerService( 68): Got RemoteException sending setActive(false) notification to pid 14742 uid 10094
20
21I/ActivityManager( 68): Displayed activity eu.primescale.primecmdb/.gui.PrimeCMDB: 511 ms
22
23D/dalvikvm( 155): GC freed 1109 objects / 461208 bytes in 127ms

Ich kann jetzt leider noch keinen Fehler da raus lesen...

— geändert am 07.02.2010, 20:52:19

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

10.02.2010, 02:25:31 via Website

Ich denke das Log ist sicherlich größer, schau mal genauer.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Martin Weißhaupt
  • Forum-Beiträge: 75

11.02.2010, 21:36:03 via Website

Alle anderen Einträge im Log haben meiner Meinung nach nichts mit meiner Anwendung zu tun.

Ich wusste mir jetzt nicht anders zu helfen als den Quelltext mal hoch zu laden und zu hoffen, dass sich jemand findet, der Zeit und Lust hat meinen Code durch zu gucken ;-)

MobileCMDB

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

12.02.2010, 01:20:57 via Website

Ich hab das mal unter Eclipse angeschaut. Der Fehler ist nicht offensichtlich, aber ein wenig Erfahrung half mir dann doch das Problem in ca. 3 Minuten zu finden.

Im Log sah ich folgendes:

02-12 01:06:40.519: DEBUG/dalvikvm(95): GC freed 2942 objects / 166504 bytes in 76ms
02-12 01:06:41.705: INFO/ActivityManager(52): Starting activity: Intent { cmp=eu.primescale.primecmdb/.gui.Statistics }
02-12 01:06:41.902: INFO/ActivityManager(52): Displayed activity eu.primescale.primecmdb/.gui.Statistics: 170 ms (total 170 ms)
02-12 01:06:41.959: DEBUG/AndroidRuntime(424): Shutting down VM
02-12 01:06:41.959: WARN/dalvikvm(424): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
02-12 01:06:41.959: ERROR/AndroidRuntime(424): Uncaught handler: thread main exiting due to uncaught exception
02-12 01:06:41.969: ERROR/AndroidRuntime(424): java.lang.RuntimeException: Unable to stop activity {eu.primescale.primecmdb/eu.primescale.primecmdb.gui.PrimeCMDB}: android.app.SuperNotCalledException: Activity {eu.primescale.primecmdb/eu.primescale.primecmdb.gui.PrimeCMDB} did not call through to super.onStop()
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3124)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3167)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.app.ActivityThread.access$2400(ActivityThread.java:116)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1810)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.os.Handler.dispatchMessage(Handler.java:99)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.os.Looper.loop(Looper.java:123)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.app.ActivityThread.main(ActivityThread.java:4203)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at java.lang.reflect.Method.invokeNative(Native Method)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at java.lang.reflect.Method.invoke(Method.java:521)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at dalvik.system.NativeStart.main(Native Method)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): Caused by: android.app.SuperNotCalledException: Activity {eu.primescale.primecmdb/eu.primescale.primecmdb.gui.PrimeCMDB} did not call through to super.onStop()
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.app.Activity.performStop(Activity.java:3596)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3121)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): ... 11 more
02-12 01:06:41.979: INFO/Process(52): Sending signal. PID: 424 SIG: 3
02-12 01:06:41.979: INFO/dalvikvm(424): threadid=7: reacting to signal 3
02-12 01:06:41.989: INFO/dalvikvm(424): Wrote stack trace to '/data/anr/traces.txt'
02-12 01:06:46.969: DEBUG/dalvikvm(200): GC freed 44 objects / 2128 bytes in 55ms






Einmal in die Klasse PRimCMDB geschaut, findet sich der Übeltäter auch sofort.


1@Override
2 public void onStop()
3 {
4 System.exit(RESULT_OK);
5 }

Das darf man nicht, an sich hätte man das aber sofort sehen müssen in den Logs.

Es wäre dadurch __richtiger__ folgendes zu schreiben:


1@Override
2 public void onStop()
3 {
4 super.onStop();
5 System.exit(RESULT_OK);
6 }


Allerdings führt das dazu das die Statistics Activity sofort beendet wird.
Ich rate daher dazu die onStop gar nicht zu implementieren und stattdessen evtl. mit startActivityForResult zu Arbeiten. Nebenbei lohnt hin und wieder ein Blick auf den Activity-Lifecycle.

Bei so wenig Code und diesem Problem sollte die letzte Änderung einfach wieder zurückgenommen werden um zu testen ob das zu dem Problem führt, so sitzt man nicht ratlos vor dem Rechner ;)

Noch was fällt am Code auf:

1System.exit(RESULT_OK);

Was soll das der JVM sagen ? RESULT_OK wird für inter-Activity Kommunikation benutzt, nicht als Return Code eines kompletten Prozesses in Android!
System.exit() will zwar einen parameter, dieser wird aber meines Wissens nach von der JVM komplett ignoriert, daher ist es gut einen anderen Entwickler der auf den Code schaut das Gefühl zu geben hier wird ein Rückgabe wert erwartet/geprüft an einer anderen Stelle! Daher ist eine System.exit(1); aussagekräftiger!


hth,
Mac

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Martin Weißhaupt

Antworten
Martin Weißhaupt
  • Forum-Beiträge: 75

12.02.2010, 12:45:20 via Website

Vielen Dank, das war tatsächlich das Problem.

In dem Eclipse Plugin muss es mehr anzeigen als im ddms oder du hast andere Einstellungen, wie dem auch sei, muss ich wohl doch Eclipse noch einmal ordentlich aufsetzen... beim letzten Mal wollte mir Eclipse nicht ganz gehorchen und die Android-Plugins nicht installieren 8o

Nun auf zu neuen Fehlern xD

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

12.02.2010, 12:57:49 via Website

Das ist das Logcat, das hat Netbeans sicherlich auch, nix was sich nicht sofort sehen lassen würde. (Ich nutze kein NB für Android Entwicklung).

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Martin Weißhaupt
  • Forum-Beiträge: 75

12.02.2010, 14:31:35 via Website

Ich habe gerade erst gemerkt, dass Netbeans unter Menü / Window / Output einen Eintrag namens ADB Log hat. doh :*)
Danke nochmal ;-)

Antworten