¿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.
- Cómo arreglar la orientación de la pantalla en vertical para toda mi aplicación PhoneGap
- Evitar la actualización de la actividad en el cambio de orientación del fragmento android
- Actividad sólo en retrato o en reverso
- IU distorsionada con Android
- Cordova ignora el bloqueo de la orientación de la pantalla
He visto tutoriales para crear oyentes de orientación, pero parecen usar llamadas de función depreciadas.
Gracias por adelantado
- Bloquear la orientación hasta que termine Asíntate
- Apoyo a las dos orientaciones del paisaje en Honeycomb
- ¿Debo hacer diferente diseño (archivos xml) para móviles android diferentes
- La lista desplegable de Spinner y la orientación de la pantalla cambian el problema
- Fragmentos anidados pierden llamadas a onCreateOptionsMenu después de rotación de pantalla
- El diálogo emergente de Spinner no ajusta su ancho en la rotación de la pantalla
- Emulador de panal invertido pantalla en retrato
- Android: Detectar la orientación cambiada
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.