0

Ich habe eine Aktivität, die ich als Launcher-Kategorie deklarieren kann und sie startet problemlos vom Startbildschirm aus. Wenn ich jedoch versuche, dieselbe Aktivität in die Einstellungsaktivität meines SyncAdapters einzubinden und sie über die Seite Sync-Seite -> MySyncAdapter -> (Touch-Account-Liste) der Accounts & zu öffnen, bricht sie mit einem schwerwiegenden Systemfehler ab (Neustarts des Telefons).Warum startet Android Account & Sync neu, wenn ich versuche, meine Einstellungsaktivität zu finden?

In der Zwischenzeit arbeitet mein SyncAdapter in anderer Hinsicht. Hier

ist das Protokoll am Punkt des Aufpralls:

01-13 12:31:00.976 5024 5038 I ActivityManager: Starting activity: Intent { act=android.provider.Settings.ACTION_SYNC_SETTINGS flg=0x10000000 cmp=com.myapp.android.syncadapter.ui/SyncAdapterSettingsActivity.class (has extras) } 
01-13 12:31:00.985 5024 5038 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: android.server.ServerThread 
01-13 12:31:00.985 5024 5038 E AndroidRuntime: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.myapp.android.syncadapter.ui/SyncAdapterSettingsActivity.class}; have you declared this activity in your AndroidManifest.xml? 
01-13 12:31:00.985 5024 5038 E AndroidRuntime: at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1404) 
01-13 12:31:00.985 5024 5038 E AndroidRuntime: at android.app.Instrumentation.execStartActivity(Instrumentation.java:1378) 
01-13 12:31:00.985 5024 5038 E AndroidRuntime: at android.app.ContextImpl.startActivity(ContextImpl.java:622) 
01-13 12:31:00.985 5024 5038 E AndroidRuntime: at android.preference.Preference.performClick(Preference.java:828) 
01-13 12:31:00.985 5024 5038 E AndroidRuntime: at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:190) 
01-13 12:31:00.985 5024 5038 E AndroidRuntime: at android.widget.AdapterView.performItemClick(AdapterView.java:284) 
01-13 12:31:00.985 5024 5038 E AndroidRuntime: at android.widget.ListView.performItemClick(ListView.java:3382) 
01-13 12:31:00.985 5024 5038 E AndroidRuntime: at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696) 
01-13 12:31:00.985 5024 5038 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:587) 
01-13 12:31:00.985 5024 5038 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:92) 
01-13 12:31:00.985 5024 5038 E AndroidRuntime: at android.os.Looper.loop(Looper.java:123) 
01-13 12:31:00.985 5024 5038 E AndroidRuntime: at com.android.server.ServerThread.run(SystemServer.java:517) 
01-13 12:31:00.985 5024 5038 I Process : Sending signal. PID: 5024 SIG: 9 
01-13 12:31:01.005 5019 5019 I Zygote : Exit zygote because system server (5024) has terminated 
01-13 12:31:01.015 1211 1211 E installd: eof 

Hier ein Ausschnitt aus meinem Manifest-Datei ist:

<activity android:name="com.myapp.android.syncadapter.ui.SyncAdapterSettingsActivity" 
       android:label="@string/title_settings" 
       android:windowSoftInputMode="stateAlwaysHidden|adjustPan"> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <action android:name="android.intent.action.MAIN" /> 
      <action android:name="android.provider.Settings.ACTION_SYNC_SETTINGS"/> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

ich über die XML-Ressource-Datei vergessen haben (account_preferences.xml), das ist verwiesen. Es bietet eine weitere Indirektionsstufe - einen Verweis auf den Namen der Aktivität. Ich kann es manipulieren, um den Protokolleintrag entsprechend zu ändern. Also, ich denke, das ist ein Hinweis auf die Lösung. Das Zielpaket und die Zielklasse werden miteinander verkettet, um den Namen der zu startenden Aktivität zu definieren. Was ich im Protokoll bemerkt habe, ist, dass im Pfadnamen ein Schrägstrich (/) steht und ich denke, dass er deshalb die Aktivität nicht finden kann. Zum Beispiel, wenn ich die (.ui) aus dem Paket nehmen und es in die Zielaktivität legen, dann bewegt sich der Schrägstrich vor dem .ui im Pfad.

account_preferences.xml:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <PreferenceCategory android:title="@string/format_auth_preferences" /> 
    <PreferenceScreen 
     android:key="key_syncadapter_auth" 
     android:title="@string/key_syncadapter_auth_action" 
     android:summary="@string/key_syncadapter_auth_summary"> 
     <intent 
      android:action="android.provider.Settings.ACTION_SYNC_SETTINGS" 
      android:targetPackage="com.myapp.android.syncadapter.ui" 
      android:targetClass=".SyncAdapterSettingsActivity" /> 
    </PreferenceScreen> 
</PreferenceScreen> 

log-Schnipsel:

01-14 14:34:34.270 E/AndroidRuntime(6374): *** FATAL EXCEPTION IN SYSTEM PROCESS: android.server.ServerThread 
01-14 14:34:34.270 E/AndroidRuntime(6374): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.myapp.android.syncadapter.ui/.SyncAdapterSettingsActivity}; have you declared this activity in your AndroidManifest.xml? 
+0

Benötige ich spezielle Berechtigungen? – mobibob

+0

Sicher ja, ich denke, dass Sie mindestens Konto oder etwas Ähnliches verwalten müssen. Sie sollten einen Blick auf die Probe in API 8 –

+0

@Symbiam werfen - ich werde (wieder) ein Blick auf das Beispiel in API 8 werfen. – mobibob

Antwort

0

Ich habe es! Im Grunde ist das Paket das Root-Paket und die Zielklasse ist der vollständig qualifizierte Name.

 <intent 
     android:action="android.provider.Settings.ACTION_SYNC_SETTINGS" 
     android:targetPackage="com.myapp.android.syncadapter" 
     android:targetClass="com.myapp.android.syncadapter.ui.SyncAdapterSettingsActivity" /> 

Ich hatte auch mit großer Sorgfalt auf meine AndroidManifest zu überprüfen, dass die Werte richtig geschrieben wurden, damit sie passen könnten und dass ich ein Intent-Filter hatte die sinnvoll war für die Aktivität zu reagieren.

Jetzt muss ich die Einstellungen Konfig-Aktivität implementieren und das Ergebnis in einer Absicht richtig formatieren. Ich spüre eine andere Frage von mir :)

+0

BTW - es startete mein G2 und LG, mein HTC stürzte gerade die HTC-Einstellungen Aktivität. Offenbar ist es eine Wrapper-Aktivität und verhindert, dass der Absturz auf das Betriebssystem geht?!?! Ich werde auf vier verschiedenen Geräten testen: LG, HTC, G2 und Samsung. – mobibob