Как использовать службу для мониторинга изменения ориентации в Android
Я пишу виджет, на котором будет отображаться таймер обратного отсчета. У меня есть виджет, который работает так, как я хочу, пока я не переверну телефон от пейзажа к портрету. Мой виджет не обновляется и переходит в исходное состояние при запуске виджета, пока не будет вызван onupdate мой повторяющийся сигнал. Я хотел бы вызвать onupdate вручную после изменения ориентации для обновления моего виджета, который я изучал это некоторое время, и выяснил, что мне нужно использовать Сервис, который будет отслеживать изменения ориентации и вызывать мой onupdate для мой виджет.
Моя проблема заключается в том, что я не могу найти прямой ответ о том, как использовать службу для мониторинга изменений. Я видел, что с активностью я могу добавить android: configChanges = "orientation | keyboardHidden" в манифест для активности и использовать onConfigurationChanged, но могу ли я сделать это для службы. Если да, то как? Есть ли лучший способ контролировать изменение ориентации? Я также читал в Интернете, что услуга - это не лучший способ сделать это.
Я видел учебные пособия для создания ориентированных слушателей, но они, похоже, используют неназначенные вызовы функций.
Спасибо в Advance
Ответы
Ответ 1
Service#onConfigurationChanged(Configuration newConfig)
работает для меня. Не нужно регистрировать приемников для моего мнения. Я также не добавлял фильтр в AndroidManifest. Я что-то пропустил в дискуссии, так как никто не предлагал это решение? Моя служба работает на переднем плане.
Просто разместите внутри своей службы:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//Your handling
}
Ответ 2
Ниже приведен пример, который делает то, о чем вы просите, надеюсь, что это поможет.
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) );
}
}
и здесь идет класс 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 Landscape
Log.d(TAG, "LANDSCAPE");
}
else {
Log.d(TAG, "PORTRAIT");
}
}
}
};
}
и вот часть определения MyService в файле манифеста
<!-- 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>
Ответ 3
Вы можете создать BroadcastReceiver, который прослушивает Intent.ACTION_CONFIGURATION_CHANGED (android.intent.action.CONFIGURATION_CHANGED)
Заметьте, что он говорит:
Вы не можете получить это через компоненты, объявленные в манифесте, только путем явной регистрации для него Context.registerReceiver().
Это означает, что вы не можете зарегистрировать получателя в файле манифеста. Вам нужно будет зарегистрировать его в коде.
затем получите конфигурацию и проверьте, какая ориентация указана как указано выше.
Ответ 4
Я предлагаю вам использовать объект OrientationEventListener. Он делает именно то, что вы ищете, и он не устарел. Это было примерно с уровня API 3.