Как использовать службу для мониторинга изменения ориентации в 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.