Как использовать сервис для мониторинга изменения ориентации в Android - PullRequest
18 голосов
/ 07 января 2011

Я пишу виджет, который будет отображать таймер обратного отсчета.У меня есть виджет, работающий так, как я хочу, пока я не переверну телефон из пейзажа в портрет.Мой виджет не обновляется и переходит в исходное состояние при запуске виджета до тех пор, пока мой повторяющийся сигнал тревоги не вызовет обновление.Я хотел бы вызвать onupdate вручную после изменения ориентации, чтобы обновить мой виджет. Я изучал это некоторое время назад и обнаружил, что мне нужно использовать Сервис, который будет отслеживать изменения ориентации и вызывать мое обновление длямой виджет

Моя проблема в том, что я не могу найти прямой ответ о том, как использовать сервис для мониторинга изменений.Я видел, что с помощью действия я могу добавить android: configChanges = "direction | keyboardHidden" к манифесту для действия и использовать onConfigurationChanged , но можно ли это сделатьоказание услуг.Если так, то как?Есть ли лучший способ отслеживать изменение ориентации?Я также прочитал в Интернете, что сервис не лучший способ сделать это либо.

Я видел учебники по созданию слушателей ориентации, но они, похоже, используют устаревшие вызовы функций.

Заранее спасибо

Ответы [ 4 ]

26 голосов
/ 25 февраля 2015

Service#onConfigurationChanged(Configuration newConfig) у меня работает.Не нужно регистрировать приемники на мой взгляд.Я также не добавил ни одного фильтра в AndroidManifest.Я что-то упустил в обсуждении, так как никто не предложил это решение?Мой сервис работает на переднем плане.

Просто разместите внутри своего сервиса:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    //Your handling
}
13 голосов
/ 12 февраля 2011

Ниже приведен пример, который делает то, что вы просите, надеюсь, это поможет.

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's 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>
2 голосов
/ 07 января 2011

Вы можете создать BroadcastReceiver , который прослушивает Intent.ACTION_CONFIGURATION_CHANGED (android.intent.action.CONFIGURATION_CHANGED)

Обратите внимание, что он говорит:

Вы не можете получить это через компоненты, объявленные в манифестах, только путем явной регистрации его в Context.registerReceiver ().

Это означает, что вы не можете зарегистрировать свой получатель вфайл манифеста.Вам нужно будет зарегистрировать его в коде.

, затем получить конфигурацию и проверить ориентацию, указанную Флерном.

1 голос
/ 02 июля 2012

Я бы посоветовал вам использовать OrientationEventListener объект.Это именно то, что вы ищете, и это не устарело.Это было вокруг с уровня API 3 *. 1003 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...