2011-01-07 4 views
13

Ich schreibe ein Widget zu überwachen, die einen Countdown-Timer angezeigt werden. Ich habe das Widget arbeiten, wie ich es will, bis ich das Telefon von Quer- auf Hochformat drehen. Mein Widget nicht aktualisiert und geht zu ihm ist Ausgangszustand beim Start des Widgets, bis ein OnUpdate durch meine wiederholten Alarm genannt wird. Ich möchte ein OnUpdate manuell, sobald die Orientierungsänderungen rufen zu meinem Widget aktualisieren Ich habe das jetzt für eine Weile untersucht, und ich habe herausgefunden, dass ich brauche einen Service zu nutzen, die die Orientierungsänderungen überwachen und meine OnUpdate verlangen mein Widget.Wie verwende ich einen Dienst Orientierungsänderung in Android

Mein Problem ist, dass ich keine direkte Antwort finden kann, wie man einen Dienst verwendet, um die Änderung zu überwachen. Ich habe gesehen, dass mit einer Aktivität kann ich hinzufügen android: configChanges = "orientation | keyboardHidden" in das Manifest für eine Aktivität und verwenden Sie eine onConfigurationChanged, aber kann ich dies für einen Dienst tun. Wenn das so ist, wie? Gibt es eine bessere Möglichkeit, die Orientierungsänderung zu überwachen? Ich habe auch im Internet gelesen, dass ein Dienst nicht der beste Weg ist, dies zu tun.

Ich habe Tutorials zum Erstellen von Orientierungslistenern gesehen, aber sie scheinen abgeschriebene Funktionsaufrufe zu verwenden.

Vielen Dank im Voraus

+0

haben Sie jemals eine gute Lösung für diese finden? – Patrick

Antwort

1

Sie eine BroadcastReceiver, die für Intent.ACTION_CONFIGURATION_CHANGED (android.intent.action.CONFIGURATION_CHANGED)

Hinweis hört schaffen könnte, dass er sagen wird:

Sie können dies nicht erhalten durch Komponenten in Manifesten deklariert, nur durch explizite Registrierung für sie mit Context.registerReceiver().

Das bedeutet, dass Sie Ihren Empfänger nicht in der Manifestdatei registrieren können. Sie müssten es im Code registrieren.

dann holen Sie sich die Konfiguration und prüfen Sie, wie die Ausrichtung Floern angegeben ist.

+0

Ist es möglich, _Intent.ACTION_CONFIGURATION_CHANGED_ zum appwidgetprovider da es sich um eine modifizierte Rundfunkempfänger? Ich vermute nicht. Wenn ich den Broadcast-Empfänger erstelle, muss ich ihn irgendwo starten oder startet er automatisch, wenn mein Widget startet? – Dysen

+0

Ich habe endlich herausgefunden, wie man das umsetzen kann, worüber man spricht. Meine nächste Frage ist, warum würde ich den Empfänger in einem Dienst registrieren? würde der Service nicht nach der Registrierung verlassen? Kann ich den Empfänger in der Widgetkonfigurationsaktivität registrieren? Muss die Entität, die den Broadcast-Empfänger registriert hat, im Speicher bleiben, damit sie ausgeführt werden kann? – Dysen

13

Hier finden Sie ein Beispiel, das tut, was Sie fragen, hoffe, das hilft.

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)); 
    } 
} 

und hier kommt MyService Klasse

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"); 
       } 
      } 
     } 
    }; 
} 

und hier ist der Teil MyService in Manifest-Datei ich Ihnen

<!-- 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

Das Problem ist, das wird nur funktionieren, wenn die Anwendung Rotation unterstützt. Wenn Ihr Launcher die Rotation auf Querformat nicht unterstützt, funktioniert es nicht von einem Dienst. Meine Vermutung wäre, die Sensoren zu benutzen, um es zu bekommen, aber ich bin mir nicht sicher, wie. –

+0

@WareNinja: Die oben funktioniert nicht, wenn der Benutzer manuell die Ausrichtung geändert, indem die „Auto Rotation“ Taste in der Benachrichtigungsleiste klicken. – ChuongPham

+0

@ChuongPham: Auto-Rotation und manuell die Ausrichtung ändern? Könntest du bitte mehr erklären, es ist verwirrend, was du sagen wolltest? – xmen

0

definieren würde vorschlagen, verwenden Sie ein OrientationEventListener Objekt. Es macht genau das, wonach Sie suchen und es ist nicht veraltet. Es ist seit API-Ebene 3 gewesen.

+0

OrientationEventListener funktioniert nicht, wenn der Benutzer manuell die Ausrichtung geändert, indem die „Auto Rotation“ Taste in der Benachrichtigungsleiste klicken und hat das Telefon flach auf einer Oberfläche. Es funktioniert nur, wenn der Benutzer sein Telefon nimmt und es bewegt/rotiert. – ChuongPham

20

Service#onConfigurationChanged(Configuration newConfig) funktioniert für mich. Keine Notwendigkeit, Empfänger für meine Meinung zu registrieren. Ich habe auch keinen Filter zu AndroidManifest hinzugefügt. Habe ich etwas in der Diskussion vermisst, da niemand diese Lösung vorgeschlagen hat? Mein Dienst läuft im Vordergrund.

Legen Sie einfach in Ihrem Service:

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

Ja das funktioniert und ist viel einfacher als für Broadcast-Absichten Registrierung notwendig! – Flyview