28

facebook メッセンジャー アプリの一部である facebook チャットヘッドで、次の動作に気付きました: 私が見る限り、チャット ヘッド自体と開いているチャット画面はすべてサービスの一部です。アクティビティは含まれません。

どうすれば確信できますか?開いたチャット画面でホームを押すと、最小化されてチャット ヘッドに戻り、すぐにチャット画面を再度開くことができます。チャット画面がアクティビティの場合、ホーム ボタンが押された後にアクティビティを再度開くと、次のようstartActivity(intent)にアクティビティの開始が遅れます: ホーム ボタンを押した後、5 秒の遅延なしでサービスからアクティビティを開始する

そしてここ:ホームボタンを押したときにアクティビティを表示するのに5秒遅れる理由は?

サービスの onCreate メソッドでは、次のコードを使用してサービスから UI を表示します。

public class ServiceTest extends Service {
...
    @Override 
    public void onCreate() {
        super.onCreate();

        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

        windowManager.addView(someView, params);
    }
....
}

UIを表示するサービスから「ホームボタンが押された」イベントを直接受け取る方法を知っている人はいますか? ユーザーがホームボタンを押したときに、ビューを最小化したいと思います (Facebook のチャットヘッドに似ています)。

4

8 に答える 8

2

これが私のやり方です。それはうまくいきます。onReceive() 関数に入れます。

if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS))
    {
        String reason = intent.getStringExtra(SYSTEM_REASON);

        //Toast.makeText(context,"ACTION_CLOSE_SYSTEM_DIALOGS : Reason : " + reason ,Toast.LENGTH_LONG).show();

        // Detect home screen key press or "recent app" key pressed when screen is in unlocked state
        if (reason != null)
        {
            if (reason.equals(SYSTEM_HOME_KEY))
            {
            // For Home press
            }
            else if (reason.equals(SYSTEM_RECENT_APPS))
            {
            // For long press
            }
        }
    }
于 2016-02-18T15:26:27.937 に答える
2

私の答えを完全に編集してください。

アクティビティで以下のメソッドをオーバーライドします。

 @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);           
    }

上記のメソッドをオーバーライドした後、 onKeyDown() メソッドを使用して、アクティビティで HOME キーの押下を簡単にリッスンできるようになりました。

  @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {     

        if(keyCode == KeyEvent.KEYCODE_HOME)
        {
           //The Code Want to Perform. 
        }
    });

これを試してみてください

于 2013-08-07T12:26:04.610 に答える
2

上位の実行中のアクティビティを監視 (たとえば、200 ミリ秒ごとにチェック) し、それが自分のアクティビティなのか他のアクティビティなのかを確認し、いつ変化するかを知ることができます。これにより、着信などのケースを処理することもできます。

ActivityManager am = (ActivityManager) context.getSystemService(Activity.ACTIVITY_SERVICE);
am.getRunningTasks(1).get(0).topActivity...
于 2013-08-17T05:08:55.383 に答える
2

これが実際のサンプルコードです。

mLinear =  new LinearLayout(getApplicationContext()) {

          //home or recent button
          public void onCloseSystemDialogs(String reason) {
              //The Code Want to Perform. 
          }

          @Override
          public boolean dispatchKeyEvent(KeyEvent event) {
              if (event.getKeyCode() == KeyEvent.KEYCODE_BACK
                || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP
                || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN
                || event.getKeyCode() == KeyEvent.KEYCODE_CAMERA ) {

              //The Code Want to Perform.
              }
          return super.dispatchKeyEvent(event);
          }
};

mLinear.setFocusable(true);

View mView = inflate.inflate(R.layout.floating_panel_layout, mLinear);
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);

//params
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
             width,
             height,
             WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
             WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_FULLSCREEN
                    | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
              PixelFormat.TRANSLUCENT);
params.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;
wm.addView(mView, params);
于 2016-02-09T15:09:05.870 に答える
0

カテゴリ HOME をマニフェスト ファイルに追加できます。

于 2013-08-17T22:14:36.837 に答える