2011-09-05 32 views
7

Mam wyjątek wskaźnika pustego w emulatorze Androida 3.2 na prostym projekcie Android utworzonym przez Wyded z usługą w oddzielnym procesie, kiedy przełączam się pomiędzy "Rozciągnij, aby wypełnić ekran", "Powiększ do wypełnienia" ekran". Ta awaria stanie się nieunikniona, jeśli usługa zostanie poddana temu samemu procesowi z głównym działaniem, a mianowicie nie zostanie określony atrybut "android: process". Chociaż dzieje się tak tylko wtedy, gdy dodam "android: process" do pliku manifestu dla mojej usługi testowej.Wyjątek NullPointerException w WindowManagerImpl na systemie Android OS 3.2

Wyjątek:

FATAL EXCEPTION: main 

    java.lang.NullPointerException 
     at android.view.WindowManagerImpl.reportNewConfiguration(WindowManagerImpl.java:427) 
     at android.app.ActivityThread.handleUpdatePackageCompatibilityInfo(ActivityThread.java:2801) 
     at android.app.ActivityThread.access$2700(ActivityThread.java:122) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1151) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:132) 
     at android.app.ActivityThread.main(ActivityThread.java:4123) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:491) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
     at dalvik.system.NativeStart.main(Native Method) 

My kod badania:

TestActivity.java (generowanych przez Wizerd)

package com.test; 

import android.app.Activity; 

public class TestActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Intent intent = new Intent(this, TestService.class); 
     startService(intent); 
    } 
} 

TestService.java (większość funkcji jest pusty)

Package com.test; 

import android.content.ComponentName; 

public class TestService extends Service { 
    private boolean m_connected = false; 

    private ServiceConnection m_connInitService = new ServiceConnection() { 
     public void onServiceConnection(ComponentName className, IBinder service) { 
      m_connected = true; 
     } 

     public void onServiceDisconnected(ComponentName className) { 
     } 
    }; 

    public static class TestServiceBinder extends Binder { 
    } 

    public IBinder onBind(Intent intent) { 
     return new TestServiceBinder(); 
    } 

    public void onDestroy() { 
     super.onDestroy(); 
    } 

    public int onStartCommand(Intent intent, int flags, int startId) { 
     return 1; 
    } 
} 

Jeśli uruchomię aplikację testową bez usługi lub z usługą w tym samym procesie, przełącznik zgodności ekranu nie spowoduje żadnego problemu. Jednak nie rozumiem, dlaczego usługa może powodować wyjątek systemu podczas przełączania zgodności ekranu. Czy to dlatego, że proces serwisowy jest procesem niezgodnym z interfejsem użytkownika? Które mogą potencjalnie wywołać błąd w rdzeniu Androida?

+0

Dzieje się tak również z mojej aplikacji na tablecie XOOM. Mam również zobowiązaną służbę do mojej działalności, w której to się dzieje. – Jona

+0

Czy kiedykolwiek znalazłeś rozwiązanie? –

Odpowiedz

0

Znalazłem w dokumentacji następujące rzeczy:

android: Proces

Jeśli nazwa przypisana do tego atrybutu zaczyna się dwukropkiem (':'), A nowy proces, prywatny do aplikacji, jest tworzony, gdy jest potrzebny , a usługa działa w tym procesie. Jeśli nazwa procesu zaczyna się od małą literą, usługa uruchomi globalny proces o nazwie , pod warunkiem, że ma na to zezwolenie. Pozwala to komponentom w różnych aplikacjach na współdzielenie procesu, redukując zużycie zasobów przez .

Tak więc, jeśli przypiszesz nazwę procesu, która zaczyna się od małej litery, powinieneś mieć uprawnienia do tego. Ale nie wiem, gdzie te uprawnienia są sprawdzane. Może są one sprawdzane w WindowManagerImpl i nie może znaleźć tego globalnego procesu, a tym samym zwraca wartość null. To tylko założenie.

Powiązane problemy