¿Cómo utilizo un servicio para supervisar el cambio de orientación en Android?

Estoy escribiendo un Widget que mostrará un temporizador de cuenta regresiva. Tengo el widget funcionando de la manera que lo desee hasta que vuelva a girar el teléfono de un paisaje a otro. Mi widget no se actualiza y va a su estado inicial al inicio del widget hasta que un onupdate es llamado por mi alarma recurrente. Me gustaría llamar a un onupdate manualmente una vez que la orientación cambia para actualizar mi widget He estado investigando esto por un tiempo y he descubierto que tengo que usar un servicio que monitoreará los cambios de orientación y llamará a mi onupdate para Mi widget

Mi problema es que no puedo encontrar una respuesta directa sobre cómo utilizar un servicio para supervisar el cambio. He visto que con una actividad puedo añadir android: configChanges = "orientation | keyboardHidden" al manifiesto para una actividad y usar un onConfigurationChanged , pero puedo hacer esto para un servicio. ¿Si es así, cómo? ¿Existe una mejor manera de monitorear el cambio de orientación? También he leído en Internet que un servicio no es la mejor manera de hacer esto tampoco.

He visto tutoriales para crear oyentes de orientación, pero parecen usar llamadas de función depreciadas.

Gracias por adelantado

Service#onConfigurationChanged(Configuration newConfig) funciona para mí. No es necesario registrar receptores para mi opinión. Tampoco agregé ningún filtro a AndroidManifest. ¿Perdí algo en la discusión ya que nadie sugirió esta solución? Mi servicio se ejecuta en primer plano.

Solo colóquelo dentro de su servicio:

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

A continuación, encontrará un ejemplo que hace lo que usted pide, espero que esto ayude.

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

Y aquí viene la clase 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"); } } } }; } 

Y aquí está la parte para definir MyService en archivo de manifiesto

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

Puede crear un BroadcastReceiver que escuche Intent.ACTION_CONFIGURATION_CHANGED (android.intent.action.CONFIGURATION_CHANGED)

Tenga en cuenta que sí dice:

No se puede recibir esto a través de componentes declarados en manifiesto, solo mediante el registro explícito para ello con Context.registerReceiver ().

Lo que significa que no puede registrar su receptor en el archivo de manifiesto. Tendría que registrarlo en código.

A continuación, obtener la configuración y comprobar lo que la orientación es como dijo Floern.

Sugiero que utilice un objeto OrientationEventListener . Hace exactamente lo que está buscando y no está obsoleto. Ha estado alrededor desde el nivel 3 de la API.

  • Después de que los botones de cambio de orientación en un widget no responden
  • Cómo manejar los cambios de orientación de la pantalla cuando hay una asyntax ejecutando con android 4.x
  • Problemas al manejar los cambios de orientación
  • ¿Tengo que usar el acelerómetro en Android para que mis fotos se orienten correctamente?
  • Establecer nuevo fragmento en la parte superior de la actividad no funciona con onConfiguration change
  • Problemas al manejar los cambios de orientación
  • ¿Cómo forzar un cambio de configuración en una prueba Android Robolectric?
  • Cambiar la orientación de la pantalla mediante un botón
  • Cambio de orientación de la pantalla de la tableta: no se ha encontrado ninguna vista para id para Fragment
  • Fragmento manejo de la orientación de la pantalla con pestañas en barra de acción
  • Android: Guardar el estado de la aplicación en el cambio de orientación de la pantalla
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.