サービスで画面回転を感知するには

サービスはアクティビティと違ってウインドウを持たないので、画面が回転してもonStartは呼ばれません。

そこで、画面が回転したかどうかを確かめるには端末全体の設定が変わった時に呼び出されるCONFIGURATION_CHANGEDアクションをブロードキャストレシーバーで受け取ります。

サービス実装

画面回転を受け取るためにまず、サービス内でブロードキャストレシーバーを作り、その中でCONFIGURATION_CHANGEDを受け取ります。

簡単な例として次のようなサービスを作りました。

public class SimpleService extends Service 
{
    /**設定変更を受け取るレシーバー*/
    private ConfigChangeReceiver configReceiver;

    public void onCreate()
    {
        super.onCreate();
        
        IntentFilter filter = new IntentFilter(
                "android.intent.action.CONFIGURATION_CHANGED");
        ///設定変更時だけ受け取り
        configReceiver = new ConfigChangeReceiver()
        {
            @Override
            public void onReceive(Context context, Intent intent) 
            {
                WindowManager wm = (WindowManager) getSystemService(
                        Context.WINDOW_SERVICE);
                DisplayMetrics dm = new DisplayMetrics();
                wm.getDefaultDisplay().getMetrics(dm);
                Log.d("SimpleService", "画面幅 = " + widthPixels +
                        "  :   画面高さ = " + dm.heightPixels);
            }
        };
        registerReceiver(configReceiver, filter);
            ///レシーバー登録
    }
    
    public IBinder onBind(Intent intent)
    {return null;}
    
    public onDestroy()
    {
        super.onDestroy();
        
        unregisterReceiver(configReceiver);
            ///レシーバ解除
    }
    
    /**端末の設定変更を受け取るレシーバー*/
    class ConfigChangeReceiver extends BroadcastReceiver
    {
        public void onReceive(Context context, Intent intent){}
    }
}

画面回転などの端末の設定が変更されると"android.intent.action.CONFIGURATION_CHANGED"が発信されるのでサービス内のレシーバーでこれを受け取っています。

あとは普通にWindowManagerから画面サイズが取得できます。

AndroidManifestの設定

最後にAndroidManifest.xmlのサービスのintent-filter要素を追加します。

        <service android:name=".SimpleService" >
            <!-- intent-filterを追加 -->
            <intent-filter>
                <action android:name="android.intent.action.CONFIGURATION_CHANGED" />
            </intent-filter>
        </service>
     </application>
 </manifest>

これでサービス内でCONFIGURATION_CHANGEDアクションを受信できます。

あとは実際に画面を回転してみるとレシーバーでそれを受け取るのが確認できるはずです。

以上、画面回転をサービスで感知する方法でした。

では、また!

関連項目
プライバシーポリシー