Activity内でHOMEボタンを受け取る方法

HOMEボタンは通常のキーイベントでは受け取ることができない仕組みになっています。

そこでここではHOMEボタンを受け取る方法を2つ紹介します。

その1 : onUserLeaveHintを使う方法

そこでAPIレベル3から追加されたonUserLeaveHintメソッドを使うことでActivity内でHOMEボタンを受け取れるようになります。実装は簡単で次のようにonUserLeaveHintをオーバーライドするだけです。

public class MainActivity extends SherlockFragmentActivity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    @Override
    public void onUserLeaveHint()
    {
        /** HOMEボタンが押されたときの処理 */
    }
}

onUserLeaveHintは次の場合に呼び出されます。

上記以外の場合、たとえばBACKボタンが押されたときや、電話がかかってきて電話アプリが起動したときなどはonUserLeaveHintは呼び出されないのでHOMEボタンの検知には便利です。

その2:Intent.ACTION_CLOSE_SYSTEM_DIALOGSを使う方法

次はBroadcastReceiverからHOMEボタンの押下を受け取る方法です。

これを使うと純粋にHOMEボタンが押されたことに反応します。

コードは次のようになります。

public class MainActivity extends Activity
{
    private HomeButtonReceive homeButtonReceiver;
    
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        /** レシーバーを登録 */
        homeButtonReceiver = new HomeButtonReceive();
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        registerReceiver(homeButtonReceiver, filter);
        
    }
    
    @Override
    public void onDestory()
    {
        super.onDestory();
        
        /** レシーバーの登録を解除 */
        if(homeButtonReceiver != null)
            unregisterReceiver(homeButtonReceiver);
    }
    
    /** HOMEボタンの押下を受け取るレシーバー */
    public class HomeButtonReceive extends BroadcastReceiver
    {
        @Override
        public void onReceive(Context arg0, Intent arg1)
        {
            /** HOMEボタンの押下を受け取った時の処理 */
        }
    }
}

この方法ならHOMEボタンを確実に受け取れるのですが、1つ問題があります。

それはアプリがバックグラウンドにいてもHOMEボタンが押されるとonReceiveが呼ばれてしまうということです。

この点を除けばHOMEボタンだけを受け取れるので使いやすい方法です。



以上、HOMEボタンを受け取る方法を2つ紹介しましたが、どちらにも長所と短所があるので場合に応じて使い分けるのが良いと思います。

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