22

カウントダウン タイマーを表示するウィジェットを作成しています。携帯電話を横向きから縦向きに切り替えるまで、ウィジェットは思い通りに機能しています。定期的なアラームによって onupdate が呼び出されるまで、ウィジェットが更新されず、ウィジェットの開始時に初期状態になります。ウィジェットを更新するために向きが変わったら、手動で onupdate を呼び出したいと思います。これについてしばらく調査していたところ、向きの変化を監視して onupdate を呼び出すサービスを使用する必要があることがわかりました。私のウィジェット。

私の問題は、サービスを使用して変更を監視する方法について、明確な答えが見つからないことです。アクティビティでは、アクティビティのマニフェストにandroid:configChanges="orientation|keyboardHidden"を追加 してonConfigurationChangedを使用できることがわかりましたが、サービスに対してこれを行うことはできますか。もしそうなら、どのように?向きの変化を監視するより良い方法はありますか? また、インターネットで、サービスがこれを行うための最良の方法ではないことも読みました。

オリエンテーション リスナーを作成するためのチュートリアルを見たことがありますが、減価償却された関数呼び出しを使用しているようです。

前もって感謝します

4

4 に答える 4

14

あなたが求めていることを行う例を以下に見つけてください。これがお役に立てば幸いです。

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>
于 2011-02-12T16:05:45.473 に答える
2

Intent.ACTION_CONFIGURATION_CHANGED (android.intent.action.CONFIGURATION_CHANGED)をリッスンするBroadcastReceiverを作成できます。

それは言うことに注意してください:

Context.registerReceiver() で明示的に登録するだけで、マニフェストで宣言されたコンポーネントを介してこれを受け取ることはできません。

つまり、受信者をマニフェスト ファイルに登録することはできません。コードで登録する必要があります。

次に、構成を取得し、フローンが述べたように向きを確認します。

于 2011-01-07T14:23:51.743 に答える
1

OrientationEventListenerオブジェクトを使用することをお勧めします。それはあなたが探していることを正確に行い、非推奨ではありません。API レベル 3 から存在しています。

于 2012-07-02T09:59:14.397 に答える