30

このボタンがどのメソッドを呼び出すのか疑問に思います。

ここに画像の説明を入力してください

このボタンを使用する場合を除いて、ゲームは常に正しく一時停止/再開します。このボタンはアクティビティonPause()のメソッドとonResume()メソッドを呼び出さないようです。ゲームを終了し、別のウィンドウ(写真のような)に移動してから、このボタンを使用して再開すると機能します。しかし、このボタンを押すだけで、ゲーム内でゲームは一時停止しますが、スレッドは毎回のように再開しません。ゲームの種類は画面上で静止し、少しちらつきます。

説明するのは難しいですが、そうでない場合は、私がある程度明確になっていることを願っています!

4

8 に答える 8

26

「最近のアプリ」ボタンが押された場合、標準のアクティビティライフサイクルメソッドは呼び出されません。最近のアプリのポップアップのリストの後、アクティビティはアクティブなままになります。このリストの半透明の左側の部分から、この状況を適切に処理しなかったアニメーションを使用してゲームを実行している場合でも、アプリケーションアニメーションがまだ実行されていることを確認できます。実際、Google Playのゲームの多くは、Angry Birdsのような優れたゲームでさえ、この状況を適切に処理していませんでした。

ユーザーが「最近のアプリ」リストを開いたとき(またはリストから戻ったとき)に呼び出される唯一のActivityメソッドは、ブールパラメーターを持つonWindowFocusChangedhasFocusです。ユーザーがequalsでonWindowFocusChanged()呼び出された最近のアプリメソッドのリストを開いたとき、およびユーザーがこのリストでBackを押したときにequalsで呼び出された同じメソッド。hasFocusfalsehasFocustrue

于 2012-09-20T09:48:09.270 に答える
9

私は同じ問題を抱えています、私はこの問題を以下のように解決しました.er

ホームおよびRecentAppの登録ボタンクリックブロードキャスト

InnerReceiver mReceiver = new InnerReceiver();
IntentFilter mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
registerReceiver(mReceiver, mFilter);

今BroadcastReceiverコード

class InnerReceiver extends BroadcastReceiver {
    final String SYSTEM_DIALOG_REASON_KEY = "reason";
    final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
    final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
            String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
            if (reason != null) {
                if (mListener != null) {
                    if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                        // Home Button click
                    } else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
                        // RecentApp or Overview Button click
                    }
                }
            }
        }
    }
}

unregisterReceiverしかし、 BroadcastReceiverを忘れないでください

于 2018-02-24T18:55:57.967 に答える
6

[最近のアプリ]ボタンが押されたことを検出するには、ユーザー補助サービスを使用できます。独自のユーザー補助サービスを実行し、「TYPE_WINDOW_STATE_CHANGED」タイプのイベントを受信して​​、イベントのクラス名を確認する必要があります。

  1. Androidデベロッパーのアクセシビリティサービスについてお読みください。独自のユーザー補助サービスを設定し、ユーザーに許可を求めます。
  2. アクセシビリティサービスのオーバーライドメソッドでonAccessibilityEvent()
  3. このメソッドでは、オブジェクトを受け取りAccessibilityEvent eventます。このオブジェクトには、デバイスで発生したばかりのイベントに関する必要なすべての情報が含まれています。
  4. ClassNameに関心があります。ClassNameはnullになることがあるので、!=nullチェックを忘れないでください。[最近のアプリ]ウィンドウのパッケージ名は、Androidのバージョンによって異なります。

    • Android 4.1:「com.android.internal.policy.impl.RecentApplicationsDialog」
    • Android 4.2-4.4:「com.android.systemui.recent.RecentsActivity」
    • Android 5.0-7.1: "com.android.systemui.recents.RecentsActivity"( "s"の文字が追加されました)

古いデバイスのクラス名はわかりませんが、2017年に誰かがそれらを維持しているとは思いません;)

したがって、次のようなものになります。

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    if (event.getEventType() != AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED || event.getClassName() == null) 
        return;

    String className = String.valueOf(event.getClassName());

    if (className.equals("com.android.internal.policy.impl.RecentApplicationsDialog")
            || className.equals("com.android.systemui.recent.RecentsActivity")
            || className.equals("com.android.systemui.recents.RecentsActivity")){
        //Recent button was pressed. Do something.
    }
}

LG、Nexus、Sony、仮想デバイス:Motorola、Samsungの実際のデバイスでテストしました。

誰かがこれらのクラス名の例外を知っている場合は、私にpingしてください。

于 2017-03-13T21:13:10.410 に答える
4

同様の問題に直面したので、ユーザーが最近のアプリボタン(古いバージョンのAndroidではメニューキーボタン)をいつ押すかを知る必要がありました。数時間の調査の結果、ホームボタンまたはメニューボタンが押されたときにキャッチするイベントは見つかりませんでした。ユーザーがホームボタンを押すと電話をかけるのに時間がかかることがわかったonStop()ので、応答時間と2つのメソッドのオーバーライドに関連するこれらの2つのボタンを区別するためのトリックを見つけました。

@オーバーライド

public void onUserLeaveHint() {
    // do stuff
    super.onUserLeaveHint();
    userLeaveTime = System.currentTimeMillis() ;
    isNotPower = true;
}

@オーバーライド

public void onStop() {
    super.onStop();
    if (isNotPower) {
        defStop = System.currentTimeMillis() - userLeaveTime;
        if (defStop > 200 ) {
            //home button
        }
        if (defStop < 200) {
            //recent apps button
        }
    }
    isNotPower = false;
}
  • 電源ボタンが押されていないことを確認するパラメータ-isNotPower電源ボタンが押されたときにonStop()メソッドが呼び出されますが、は呼び出されませんonUserLeaveHint()
于 2015-10-06T06:37:21.037 に答える
3

私が見つけた最良の方法は、「ACTION_CLOSE_SYSTEM_DIALOGS」と呼ばれるブロードキャストアクションに耳を傾けることです。Googleドキュメントから:

ブロードキャストアクション:これは、ユーザーアクションが一時的なシステムダイアログを閉じるように要求する必要がある場合にブロードキャストされます。一時的なシステムダイアログの例としては、通知ウィンドウシェードと最近のタスクダイアログがあります。

作業コード:

IntentFilter intentFilterACSD = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);

    BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
                    //do what you want here
            }
        }
    };
    this.registerReceiver(broadcastReceiver, intentFilterACSD);
于 2017-03-30T10:53:51.967 に答える
0

これはこの特定のゲームの問題だけですか?それとも、プレイするすべてのゲームでですか?

との横に、onPause()onResume()呼ばれる別のサイクルがありonStop()ます。たぶん、ここで行われているいくつかの基本的なことがあります。その「windows-open」ボタンを押すと、ゲームはおそらくonStop-stateに移行しませんが、「home」-ボタンを押すと移行します。

于 2012-09-18T14:44:45.080 に答える
0

これを試してください:

public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    Log.d("Focus debug", "Focus changed !");

    if (!hasFocus) {
        Log.d("Focus debug", "Lost focus !");

    }
}
于 2014-01-28T11:13:40.603 に答える
0

アクティビティとフラグメントの両方に関して、 recent-apps / recentsキーの動作を明確に示すアプリを作成しました。

(通常のライフサイクルイベントがこのキーによってトリガーされないという主張は、明らかに誤りです。)

onCreate()メインアクティビティでは、すべての既知のアクティビティライフサイクルイベントをログに記録するための配列を初期化し、2番目のFrameLayoutでメインフラグメントをそれ自体と一緒に起動します。

onAttach()メインのFragmentは、既知のすべてのFragmentライフサイクルイベントをログに記録するための個別の配列を初期化します。

ロギングの目的では、アクティビティフラグメントonWindowFocusChanged()の両方が単なる別のライフサイクルイベントとして扱われます。

ログに記録されたイベントにはタイムスタンプが付けられるため、レンダリング時にユーザーの「一時停止」表示を指定できます(レンダリングはonWindowFocusChanged()いつ内部で発生しますhasFocus==true)。

テストアプリの起動時にユーザーに表示される内容は次のとおりです。

ここに画像の説明を入力してください

数秒後、ユーザーは最近のアプリを押し、数秒待ってからもう一度押すと、真実がわかります。

ここに画像の説明を入力してください

注意:最近のアプリボタンを使用する代わりに、(a)タブレットのオフ/オンボタンを押す(b)2番目のアクティビティの開始ボタン(c)を押すなどして実験を繰り返すと、同じ結果が得られます。

OPへの回答:
どうやら、最近のアプリのキーが実際に押されたことを検出できるコードはありません!

ただし、アプリは関連するライフサイクルイベントを正しく処理する必要があるため、問題ではありません。

于 2018-10-26T10:32:15.457 に答える