2011-01-07 9 views
13

Piszę widżet, który wyświetli minutnik. Mam widżet działający tak, jak chcę, dopóki nie przerzucę telefonu z krajobrazu na portret. Mój widget nie aktualizuje się i przechodzi do stanu początkowego na początku widgetu, dopóki nie zostanie wywołany przez mój powtarzający się alarm. Chciałbym ręcznie wywołać aktualizację onupdate, gdy zmieni się jej orientacja, aby zaktualizować mój widget, od jakiegoś czasu badam to i okazało się, że muszę korzystać z usługi, która będzie monitorować zmiany orientacji i wywoływać moją aktualizację mój widget.Jak używać usługi do monitorowania zmiany orientacji w systemie Android

Mój problem polega na tym, że nie mogę znaleźć prostej odpowiedzi na pytanie, jak korzystać z usługi do monitorowania zmiany. Widziałem, że z działania mogę dodać android: configChanges = "orientation | keyboardHidden" do manifestu dla działania i użyć onConfigurationChanged, ale czy mogę to zrobić dla usługi. Jeśli tak to jak? Czy istnieje lepszy sposób monitorowania zmiany orientacji? Czytałem również w Internecie, że usługa nie jest najlepszym sposobem, aby to zrobić.

Widziałem samouczki służące do tworzenia detektorów zorientowanych na orientację, ale zdają się używać amortyzowanych wywołań funkcji.

Dzięki z góry

+0

czy kiedykolwiek znaleźć dobre rozwiązanie tego problemu? – Patrick

Odpowiedz

1

Ty może stworzyć BroadcastReceiver że nasłuchuje Intent.ACTION_CONFIGURATION_CHANGED (android.intent.action.CONFIGURATION_CHANGED)

Należy pamiętać, że to nie mówi:

Nie można odbierać tego poprzez komponenty zadeklarowane w manifestach, tylko poprzez jawną rejestrację dla niego za pomocą Context.registerReceiver().

Co oznacza, że ​​nie można zarejestrować swojego odbiorcy w pliku manifestu. Będziesz musiał zarejestrować go w kodzie.

następnie uzyskaj konfigurację i sprawdź, jaka jest orientacja podana przez Floern.

+0

Czy można _Intent.ACTION_CONFIGURATION_CHANGED_ do appwidgetprovider, ponieważ jest to zmodyfikowany odbiornik transmisji? Zgaduję, że nie. Kiedy utworzę odbiornik rozgłoszeniowy, czy muszę go gdzieś uruchomić, czy uruchomi się automatycznie po uruchomieniu mojego widżetu? – Dysen

+0

W końcu zorientowałem się, jak zrealizować to, o czym mówisz. Moje następne pytanie brzmi: dlaczego miałbym zarejestrować odbiornik w serwisie? czy zgłoszenie usługi nie zakończyłoby się po zarejestrowaniu? Czy mogę zarejestrować Odbiorcę w działaniu widgetconfiguration? Czy podmiot, który zarejestrował odbiornik, musi pozostać w pamięci, aby mógł on działać? – Dysen

13

Poniżej znajduje się przykład, który robi to, o co prosisz, mam nadzieję, że to pomoże.

public class ScreenOrientationListener extends Activity { 

    private static final String TAG = "ScreenOrientationListener"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mContext = this; 

     setContentView(R.layout.main); 

     startService(new Intent(this, MyService.class)); 
    } 
} 

a tu przychodzi klasa MyService

public class MyService extends Service { 
    private static final String TAG = "MyService"; 

    private static final String BCAST_CONFIGCHANGED = "android.intent.action.CONFIGURATION_CHANGED"; 
    private static Context mContext; 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     Log.d(TAG, "onCreate()"); 

     mContext = this; 

     IntentFilter filter = new IntentFilter(); 
     filter.addAction(BCAST_CONFIGCHANGED); 
     this.registerReceiver(mBroadcastReceiver, filter); 
    } 

    @Override 
    public void onDestroy() {   
     Log.d(TAG, "onDestroy()"); 
     //Unregister receiver to avoid memory leaks 
     mContext.unregisterReceiver(mBroadcastReceiver); 
    } 

    @Override 
    public void onStart(Intent intent, int startid) { 
     Log.d(TAG, "onStart()"); 
    } 

    public BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent myIntent) { 

      if (myIntent.getAction().equals(BCAST_CONFIGCHANGED)) { 

       Log.d(TAG, "received->" + BCAST_CONFIGCHANGED); 


       if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){ 
        // it's Landscape 
        Log.d(TAG, "LANDSCAPE"); 
       } 
       else { 
        Log.d(TAG, "PORTRAIT"); 
       } 
      } 
     } 
    }; 
} 

i tutaj jest częścią zdefiniować MyService w pliku manifestu

<!-- Services --> 
     <service android:enabled="true" android:name="com.wareninja.android.external.screenorientationlistener.services.MyService"> 
      <intent-filter> 
       <action android:name="android.intent.action.CONFIGURATION_CHANGED"/> 
      </intent-filter> 
     </service> 
+0

Problem polega na tym, że działa to tylko wtedy, gdy aplikacja obsługuje rotację. Jeśli więc twój launcher nie obsługuje rotacji do pejzażu, nie będzie działać z usługi. Sądzę, że użyłbym czujników, żeby je zdobyć, ale nie jestem pewien jak. –

+0

@WareNinja: Powyższe nie działa, jeśli użytkownik ręcznie zmienił orientację, klikając przycisk "Automatyczne obracanie" na pasku powiadomień. – ChuongPham

+0

@ChuongPham: Automatyczna rotacja i ręczna zmiana orientacji? czy mógłbyś wyjaśnić więcej, myląc to, co próbujesz powiedzieć? – xmen

0

Proponuję użyć obiektu OrientationEventListener. Robi dokładnie to, czego szukasz i nie jest przestarzałe. Już od kiedy poziom interfejsu API 3.

+0

OrientationEventListener nie działa, jeśli użytkownik ręcznie zmienił orientację, klikając przycisk "Auto rotacja" na pasku powiadomień i ustawiając telefon płasko na powierzchni. Będzie działać tylko wtedy, gdy użytkownik podniesie swój telefon i przeniesie go/obróci. – ChuongPham

20

Service#onConfigurationChanged(Configuration newConfig) dla mnie działa. Nie muszę rejestrować Odbiorców w mojej opinii. Nie dodałem też żadnego filtra do AndroidManifest. Czy tęskniłem za czymś w dyskusji, skoro nikt nie zaproponował tego rozwiązania? Moja usługa działa na pierwszym planie.

Wystarczy umieścić wewnątrz serwisu:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    //Your handling 
} 
+1

Tak, to działa i jest o wiele prostsze niż rejestracja zamiarów transmisji! – Flyview

Powiązane problemy