web-dev-qa-db-ja.com

ホームボタンが押されたときにメソッドを呼び出す

Android Activities:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if(keyCode == KeyEvent.KEYCODE_BACK)
    {
        Log.d("Test", "Back button pressed!");
    }
    else if(keyCode == KeyEvent.KEYCODE_HOME)
    {
        Log.d("Test", "Home button pressed!");
    }
    return super.onKeyDown(keyCode, event);
}

ただし、KEYCODE_HOMEが有効であっても、logメソッドは起動しません。これは、戻るボタンでも機能します。誰がこれがなぜであり、これを機能させる方法を知っていますか?

52
ingh.am

[ホーム]ボタンはオーバーライドするのに非常に危険なボタンです。そのため、Androidは[戻る]ボタンと同じように動作をオーバーライドできません。

これを見てください discussion。

ホームボタンはインテント呼び出しとして実装されているように見えるため、アクティビティにインテントカテゴリを追加する必要があります。その後、ユーザーが家に着くたびに、アプリがオプションとして表示されます。ホームボタンで何を達成しようとしているのかを検討する必要があります。デバイスのデフォルトのホーム画面を置き換えない場合、HOMEボタンをオーバーロードすることには警戒しますが、それは可能です(上記のスレッドの説明に従って)。

32
Nick Campion

これを完了するには、ほぼ1か月かかりました。今、この問題を解決しました。アクティビティのonPause()には、次のif条件を含める必要があります。

    if (this.isFinishing()){
        //Insert your finishing code here
    }

IsFinishing()関数はブール値を返します。アプリが実際に閉じている場合はTrue、アプリがまだ実行されているが画面がオフになる場合はFalse。

それが役に立てば幸い!

22
Raphael

HOMEボタンは、アプリケーションによってインターセプトできません。これは、Androidの設計上の動作です。その理由は、悪意のあるアプリが携帯電話を制御できないようにするためです(ユーザーが押したり家に戻ったりできない場合、アプリを終了できない可能性があります)。 [ホーム]ボタンはユーザーの「セーフゾーン」と見なされ、常にユーザーが構成したホームアプリを起動します。

上記の唯一の例外は、自宅交換として設定されたアプリです。つまり、関連するアクティビティのAndroidManifest.xmlで次の宣言があります。

<intent-filter>
   <action Android:name="Android.intent.action.MAIN" />
   <category Android:name="Android.intent.category.HOME" />
   <category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>

ホームボタンを押すと、現在のホームアプリのアクティビティのonNewIntentが呼び出されます。

12
Lior

HOMEボタンを押すとonStop()メソッドが呼び出されることがわかりました。次のコードを使用して監視できます。

@Override
    protected void onStop() 
    {
        super.onStop();
        Log.d(tag, "MYonStop is called");
        // insert here your instructions
    }
7
Aderito Brinca

BroadcastReceiverを使用

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // something
    // for home listen
    InnerRecevier innerReceiver = new InnerRecevier();
    IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
    registerReceiver(innerReceiver, intentFilter);

}



// for home listen
class InnerRecevier extends BroadcastReceiver {

    final String SYSTEM_DIALOG_REASON_KEY = "reason";
    final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
            String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
            if (reason != null) {
                if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                    // home is Pressed
                }
            }
        }
    }
}
3
d0ye

KeyEvent.KEYCODE_HOMEは傍受できません。

それが可能だとしたら、かなり悪いでしょう。

(編集):私はニックスの答えを見るだけで、完璧です;)

3
Oliver

ホームボタンの押下を処理する簡単なソリューションがあります。ここに私のコードがあります、それは便利です:

public class LifeCycleActivity extends Activity {


boolean activitySwitchFlag = false;

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if(keyCode == KeyEvent.KEYCODE_BACK)
    {
        activitySwitchFlag = true;
        // activity switch stuff..
        return true;
    }
    return false;
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

@Override 
public void onPause(){
    super.onPause();
    Log.v("TAG", "onPause" );
    if(activitySwitchFlag)
        Log.v("TAG", "activity switch");
    else
        Log.v("TAG", "home button");
    activitySwitchFlag = false;
}

public void gotoNext(View view){
    activitySwitchFlag = true;
    startActivity(new Intent(LifeCycleActivity.this, NextActivity.class));
}

}

要約すると、アクティビティにブール値を入れ、アクティビティの切り替えが発生した場合(startactivityイベント)、変数を設定し、onpauseイベントでこの変数を確認します。

2
barisatbas

onPause()メソッドを使用して、ホームボタンで行うことを行います。

2
Jawad Amjad

また、しばらくの間、HOMEボタンに苦労しました。ユーザーが[ホーム]ボタンをクリックしたときに、バックグラウンドサービス(場所をポーリングする)を停止/スキップしたかった。

これが、私が「ハックのような」ソリューションとして実装したものです。

ブール値を使用してSharedPreferencesでアプリの状態を保持する

各アクティビティで

onResume()-> appactive = trueを設定

onPause()-> appactive = falseを設定

バックグラウンドサービスは各ループでappstateをチェックし、アクションをスキップします

IF appactive = false

少なくともバッテリーを使い果たしていないので、私にとってはうまくいきます。

1
guleryuz