ตรวจจับการกดปุ่มโฮมใน Android


95

สิ่งนี้ทำให้ฉันคลั่งไคล้มาระยะหนึ่งแล้ว

มีวิธีใดในการตรวจจับได้อย่างน่าเชื่อถือว่ามีการกดปุ่มโฮมในแอปพลิเคชัน Android หรือไม่?

หากล้มเหลวมีวิธีที่ชัดเจนในการบอกว่าอะไรทำให้กิจกรรมเข้าสู่ onPause หรือไม่? เช่นเราสามารถตรวจสอบได้ว่าเกิดจากการเปิดตัวกิจกรรมใหม่หรือโดยการกดกลับ / home

คำแนะนำอย่างหนึ่งที่ฉันเห็นคือการแทนที่ onPause () และเรียก isFinishing () แต่สิ่งนี้จะส่งคืนเป็นเท็จเมื่อกดปุ่มโฮมเช่นเดียวกับที่จะทำหากกิจกรรมใหม่กำลังเริ่มต้นดังนั้นจึงไม่สามารถแยกความแตกต่างระหว่างทั้งสองได้

ความช่วยเหลือใด ๆ ที่ชื่นชมมาก

** อัปเดต **: ขอบคุณ @ android- หิวสำหรับลิงค์นี้: https://nishandroid.blogspot.com/

การควบคุมวิธีการต่อไปนี้:

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

จากนั้นเหตุการณ์ต่อไปนี้จะเริ่มขึ้นสำหรับการกดปุ่มโฮม:

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

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

ฉันไม่แน่ใจว่ามีผลข้างเคียงกับบรรทัดนี้หรือไม่:

this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);   

ดังนั้นดูเหมือนว่าจะตรงกันข้ามกับความเชื่อที่เป็นที่นิยมในความเป็นจริงคุณสามารถฟังกุญแจบ้านได้ ไม่ต้องกังวลคุณสามารถคืนค่าเท็จและให้คีย์โฮมไม่ต้องทำอะไรเลย

อัปเดต : ตามที่คาดไว้มีบางด้านที่ส่งผลกระทบต่อสิ่งนี้ดูเหมือนว่าวิดีโอที่ฝังและแผนที่ Google จะไม่สามารถมองเห็นได้เมื่อเปิดใช้งานโหมดนี้

อัปเดต : สมมติว่าแฮ็คนี้ใช้ไม่ได้ตั้งแต่ Android 4.0 เป็นต้นไป


ปัญหาของฉันไม่ได้อยู่ที่การปลอมตัวระหว่าง back และ home -key แต่ฉันต้องการสมัครให้เสร็จในทั้งสองกรณี ซึ่งผมใช้Activity.onUserLeaveHint().
ทำร้ายร่างกาย

ปัญหาเดียวคือ onUserLeaveHint () จะเริ่มทำงานเมื่อฉันเริ่มกิจกรรมจากกิจกรรมดังกล่าวฉันต้องการทราบว่ากด back หรือ home แล้วเท่านั้น ขอบคุณสำหรับคำแนะนำ
Dean Wild

นั่นเป็นเรื่องจริง แต่น่าเสียดายที่เท่าที่ฉันรู้เป็นที่เดียวที่จะได้รับข้อมูลใด ๆ เกี่ยวกับการใช้งาน Home -key ทำให้มีปัญหามากขึ้นในการเก็บเกี่ยวผลบวกที่ผิดพลาดจากหลาย ๆ คนสามารถรับรู้ได้ง่าย แต่ก็ยังทำให้งานที่ทำให้เกิดเสียงง่ายค่อนข้างซับซ้อน
ทำร้ายร่างกาย

2
@DeanWild: คุณอ่านสิ่งนี้ไหม
Pratik Bhat

2
TYPE_KEYGUARD คงที่ถูกลบออกจาก WindowManager.LayoutParams ใน Android 5.0
theb1uro

คำตอบ:


139

รหัสต่อไปนี้ใช้ได้กับฉัน :)

HomeWatcher mHomeWatcher = new HomeWatcher(this);
mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {
    @Override
    public void onHomePressed() {
        // do something here...
    }
    @Override
    public void onHomeLongPressed() {
    }
});
mHomeWatcher.startWatch();
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;

public class HomeWatcher {

    static final String TAG = "hg";
    private Context mContext;
    private IntentFilter mFilter;
    private OnHomePressedListener mListener;
    private InnerReceiver mReceiver;

    public HomeWatcher(Context context) {
        mContext = context;
        mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
    }

    public void setOnHomePressedListener(OnHomePressedListener listener) {
        mListener = listener;
        mReceiver = new InnerReceiver();
    }

    public void startWatch() {
        if (mReceiver != null) {
            mContext.registerReceiver(mReceiver, mFilter);
        }
    }

    public void stopWatch() {
        if (mReceiver != null) {
            mContext.unregisterReceiver(mReceiver);
        }
    }

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

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
                String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
                if (reason != null) {
                    Log.e(TAG, "action:" + action + ",reason:" + reason);
                    if (mListener != null) {
                        if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                            mListener.onHomePressed();
                        } else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
                            mListener.onHomeLongPressed();
                        }
                    }
                }
            }
        }
    }
}
public interface OnHomePressedListener {
    void onHomePressed();
    void onHomeLongPressed();
}

3
onHomeLongPressedดูเหมือนว่าของคุณจะสอดคล้องกับการเปิดกิจกรรมของระบบ "ล่าสุด" ในโทรศัพท์ของฉันถูกกระตุ้นโดยการกดปุ่มล่าสุดที่อยู่ถัดจากปุ่มโฮมดังนั้นข้อสันนิษฐานของรหัสของคุณเกี่ยวกับการกดค้างที่บ้านจึงไม่ถูกต้องเสมอไป
แซม

ทำไมมันไม่ได้ผลสำหรับฉันฉันทำเหมือนกันทุกประการยกเว้นลงทะเบียนการออกอากาศผ่านรายการ
Farhan

ลงทะเบียนในแอปพลิเคชันคลาสทำงานจนถึงตอนนี้ .. +1 ฉันสงสัยว่าจับอะไร? ฉันหมายความว่าเราจะหายไปไหน .. : ^)
Farhan

1
บางครั้งเจตนา getStringExtra (SYSTEM_DIALOG_REASON_KEY); คืนค่าว่าง อยากทราบว่ามันเกิดอะไรขึ้น ??
Fakher

1
เหตุผลในการกดยาวตอนนี้เรียกว่าfinal String SYSTEM_DIALOG_REASON_LONG_PRESS = "assist"
JWqvist

50

นี่เป็นคำถามเก่า แต่อาจช่วยใครบางคนได้

@Override
protected void onUserLeaveHint()
{
    Log.d("onUserLeaveHint","Home button pressed");
    super.onUserLeaveHint();
}

ตามเอกสารนี้เมธอด onUserLeaveHint () ถูกเรียกใช้เมื่อผู้ใช้คลิกปุ่มโฮมหรือเมื่อมีบางอย่างขัดจังหวะแอปพลิเคชันของคุณ (เช่นสายเรียกเข้า)

สิ่งนี้ใช้ได้กับฉัน .. :)


27
ไม่ถูกต้อง !!! ที่สั่งงานที่ปุ่ม home แต่ก็ใช้ได้เช่นกันเมื่อ Swiching Activity ด้วย Intent !!
Nikunj Paradva

1
สิ่งนี้จะดำเนินการก่อน onStop () เสมอแม้ว่ากิจกรรมอื่น ๆ จะอยู่ด้านบนหรือผู้ใช้ออกจากกิจกรรมหรือคลิกปุ่มโฮมอย่างแรง ...
Navas pk

7

เป็นไปไม่ได้ที่จะตรวจจับและ / หรือขัดขวางปุ่ม HOME จากภายในแอพ Android สิ่งนี้มีอยู่ในระบบเพื่อป้องกันแอปที่เป็นอันตรายที่ไม่สามารถออกได้


ตรวจสอบคำตอบที่ยอมรับก็เป็นไปได้ ยังไม่ได้ทดสอบกับอุปกรณ์จำนวนมาก
Dean Wild

ใช่ ... แอพขัดข้องในของฉัน
Jeremy Logan

แล้วตัวเรียกใช้งาน / แอพเปลี่ยนบ้านล่ะ? ฉันกำลังสร้างและต้องการไปที่หน้าจอแรกเมื่อผู้ใช้คลิกที่บ้าน
lisovaccaro

สำหรับตัวเรียกใช้สิ่งนี้: @Override ป้องกันโมฆะ onNewIntent (เจตนาเจตนา) {super.onNewIntent (ความตั้งใจ); / * ทำในสิ่งที่ต้องการ * /}
ต้น

ตัวเรียกใช้งาน @lisovaccaro และหรือการเปลี่ยนบ้านยังไม่รองรับโดย google (src diane hackborn) ดังนั้นคุณจึงไม่สามารถป้องกันไม่ให้ผู้ใช้คลิกปุ่มโฮมได้ คุณยังสามารถเพิ่มมุมมองของคุณเป็นกล่องโต้ตอบการแจ้งเตือนระบบซึ่งจะซ้อนทับทุกอย่าง แต่การคลิกปุ่มโฮมจะผ่านไปได้
JacksOnF1re

7

ฉันต้องการเริ่ม / หยุดเพลงประกอบในแอปพลิเคชันของฉันเมื่อกิจกรรมแรกเปิดขึ้นและปิดลงหรือเมื่อกิจกรรมใด ๆ ถูกหยุดชั่วคราวโดยปุ่มโฮมแล้วเริ่มต้นใหม่จากตัวจัดการงาน การหยุดเล่น / เล่นต่ออย่างแท้จริงActivity.onPause()และActivity.onResume()หยุดเล่นเพลงชั่วขณะดังนั้นฉันจึงต้องเขียนโค้ดต่อไปนี้:

@Override
public void onResume() {
  super.onResume();

  // start playback here (if not playing already)
}

@Override
public void onPause() {
  super.onPause();

  ActivityManager manager = (ActivityManager) this.getSystemService(Activity.ACTIVITY_SERVICE);
  List<ActivityManager.RunningTaskInfo> tasks = manager.getRunningTasks(Integer.MAX_VALUE);
  boolean is_finishing = this.isFinishing();
  boolean is_last = false;
  boolean is_topmost = false;
  for (ActivityManager.RunningTaskInfo task : tasks) {
    if (task.topActivity.getPackageName().startsWith("cz.matelier.skolasmyku")) {
      is_last = task.numRunning == 1;
      is_topmost = task.topActivity.equals(this.getComponentName());
      break;
    }
  }

  if ((is_finishing && is_last) || (!is_finishing && is_topmost && !mIsStarting)) {
    mIsStarting = false;
    // stop playback here
  }
}

ซึ่งขัดขวางการเล่นเฉพาะเมื่อแอปพลิเคชัน (กิจกรรมทั้งหมด) ปิดอยู่หรือเมื่อกดปุ่มโฮม โชคไม่ดีที่ฉันไม่สามารถจัดการเพื่อเปลี่ยนลำดับการโทรของonPause()วิธีการของกิจกรรมเริ่มต้นและแรงกระตุ้นonResume()ที่เริ่มต้นเมื่อActivity.startActivity()ถูกเรียก (หรือตรวจพบonPause()ว่าในกิจกรรมนั้นกำลังเปิดตัวกิจกรรมด้วยวิธีอื่น) ดังนั้นกรณีนี้จึงต้องได้รับการจัดการเป็นพิเศษ

private boolean mIsStarting;

@Override
public void startActivity(Intent intent) {
  mIsStarting = true;
  super.startActivity(intent);
}

ข้อเสียเปรียบอีกประการหนึ่งคือต้องGET_TASKSได้รับอนุญาตเพิ่มในAndroidManifest.xml:

<uses-permission
  android:name="android.permission.GET_TASKS"/>

การแก้ไขรหัสนี้ที่จะตอบสนองต่อการกดปุ่มโฮมนั้นเป็นไปอย่างตรงไปตรงมา


4

แทนที่onUserLeaveHint()ในกิจกรรม จะไม่มีการโทรกลับไปที่กิจกรรมใด ๆ เมื่อมีกิจกรรมใหม่เข้ามาหรือผู้ใช้กดปุ่มย้อนกลับ


4
เรียกอีกอย่างว่าเมื่อไปจากกิจกรรมหนึ่งไปยังอีกกิจกรรมหนึ่งภายในแอพ
Amir Uval

3

onUserLeaveHint ();

แทนที่เมธอดคลาสกิจกรรมนี้ซึ่งจะตรวจจับการคลิกปุ่มโฮม วิธีนี้ถูกเรียกใช้ก่อนการเรียกกลับ onPause () ของกิจกรรม แต่จะไม่ถูกเรียกเมื่อกิจกรรมถูกขัดจังหวะเช่นกิจกรรมระหว่างการโทรเข้ามาในเบื้องหน้านอกเหนือจากการขัดจังหวะนั้นจะเรียกเมื่อผู้ใช้คลิกปุ่มโฮม

@Override
protected void onUserLeaveHint() {
    super.onUserLeaveHint();
    Log.d(TAG, "home key clicked");
}

2

พยายามสร้างตัวนับสำหรับแต่ละหน้าจอ หากผู้ใช้แตะ HOME ตัวนับจะเป็นศูนย์

public void onStart() {
  super.onStart();
  counter++;
}

public void onStop() {
  super.onStop();
  counter--;    
  if (counter == 0) {
      // Do..
  }
}

3
หากคุณหมายถึงตัวนับแอปพลิเคชันส่วนกลางจะเป็นศูนย์ในช่วงเวลาหนึ่งเมื่อกิจกรรมหนึ่งถูกย้ายไปที่แบ็คสแต็กและอีกกิจกรรมหนึ่งจะถูกย้ายไปด้านบนหรือเมื่อ ativity สูงสุดเสร็จสิ้นและกิจกรรมแบ็คสแต็กจะถูกย้ายไปด้านบนซึ่งเป็นสถานที่ปกติเมื่อ คุณต้องการตอบสนองเมื่อกดปุ่มโฮม หากคุณหมายถึงตัวนับทั้งกิจกรรมจะเป็นศูนย์ทุกครั้งที่มองไม่เห็นกิจกรรม (ไม่จำเป็นต้องเกิดจากการกดปุ่มโฮม) ทางออกเดียวคือเลื่อนปฏิกิริยาของคุณโดยใช้ตัวจับเวลาเพื่อข้ามการเปลี่ยนแปลงนี้ แต่ความล่าช้าที่จำเป็นอาจไม่สามารถคาดเดาได้หรือเป็นที่ต้องการ
Blackhex

2

คุณอาจพิจารณาการแก้ปัญหาโดย Andreas Shrade ในโพสต์ของเขาในวิธีการสร้างโหมดการทำงาน Kiosk ใน Android มันค่อนข้างแฮ็ค แต่ด้วยเหตุผลที่ทำให้การสกัดกั้นของปุ่มโฮมนั้นถูกขัดขวาง;)


2

ตั้งแต่ API 14 คุณสามารถใช้ฟังก์ชันonTrimMemory()และตรวจสอบแฟล็กTRIM_MEMORY_UI_HIDDENได้ สิ่งนี้จะบอกคุณว่าแอปพลิเคชันของคุณกำลังทำงานอยู่เบื้องหลัง

ดังนั้นในคลาสแอปพลิเคชันที่กำหนดเองของคุณคุณสามารถเขียนสิ่งที่ต้องการ:

override fun onTrimMemory(level: Int) {
    if (level == TRIM_MEMORY_UI_HIDDEN) {
        // Application going to background, do something
    }
}

สำหรับการศึกษาในเชิงลึกฉันขอเชิญคุณอ่านบทความนี้: http://www.developerphil.com/no-you-can-not-override-the-home-button-but-you-dont-have -ถึง/


1
บทความดีๆ - ทางเลือกที่มีประโยชน์ที่อาจทำในสิ่งที่คนส่วนใหญ่ต้องการ
Dean Wild

ทางออกที่ดี คุณรู้วิธีตั้งค่าสถานะใหม่เมื่อแอปพลิเคชันกลับมาจากพื้นหลังหรือไม่? ตัวอย่างเช่นถ้าฉันสร้าง isInBackground บูลีนฉันต้องการรีเซ็ตเป็นเมื่อเรากลับมาจากพื้นหลัง
MikeOscarEcho

1

ฉันมีปัญหานี้และเนื่องจากการลบล้างเมธอด onKeyDown () ไม่ได้ทำอะไรเลยเนื่องจากระบบ Android ที่ใช้อยู่ไม่ได้เรียกวิธีนี้ฉันจึงแก้ไขสิ่งนี้ด้วยการแทนที่ onBackPressed () และฉันมีค่าบูลีนที่ตั้งค่าเป็นเท็จ เพราะฉันกดย้อนกลับไปให้ฉันแสดงความหมายในรหัส:

import android.util.Log;
public class HomeButtonActivity extends Activity {
    boolean homePressed = false;
    // override onCreate() here.

    @Override
    public void onBackPressed() {
        homePressed = false; // simply set homePressed to false
    }

    @Overide
    public void onResume() {
        super.onResume();
        homePressed = true; // default: other wise onBackPressed will set it to false
    }

    @Override
    public void onPause() {
        super.onPause();
        if(homePressed) { Log.i("homePressed", "yay"); }
    }

ดังนั้นเหตุผลที่สิ่งนี้ได้ผลเป็นเพราะวิธีเดียวที่จะนำทางภายนอกกิจกรรมนี้คือการกดกลับหรือกลับบ้านดังนั้นหากกดย้อนกลับฉันก็รู้ว่าสาเหตุไม่ใช่บ้าน แต่อย่างอื่นสาเหตุคือบ้านดังนั้นฉันจึงตั้งค่าบูลีนเริ่มต้น มูลค่าสำหรับ homePressed เป็นจริง อย่างไรก็ตามสิ่งนี้จะใช้ได้กับอินสแตนซ์กิจกรรมเดียวในแอปพลิเคชันของคุณเท่านั้นมิฉะนั้นคุณมีความเป็นไปได้มากกว่าที่จะทำให้เมธอด onPause () ถูกเรียก


ในความเป็นจริงเมื่อคุณไปทำกิจกรรมอื่นวิธีการหยุดชั่วคราวเรียกว่า
Fakher

นั่นเป็นเหตุผลที่ฉันระบุอย่างชัดเจนว่าสิ่งนี้จะใช้ได้ก็ต่อเมื่อแอปพลิเคชันของคุณรวมกิจกรรมเดียวเท่านั้น!
Moshe Rabaev

และจะเกิดอะไรขึ้นหากมีการเรียกใช้กิจกรรมที่ไม่เกี่ยวข้องหลายรายการในเวลาเดียวกันและผู้ใช้เพียงแค่สลับไปมา อุปกรณ์ Android สมัยใหม่รองรับการทำงานหลายอย่าง ด้วยรหัสนี้ดูเหมือนว่าการเปลี่ยนกลับไปที่แอปของคุณจะถูกตั้งค่าhomePressedเป็นจริงจากนั้นการเปลี่ยนไปใช้แอปอื่นจะคิดว่ามีการกดปุ่มโฮมเมื่อไม่ได้ใช้งานจริงๆ
Remy Lebeau

0

ตัวเลือกสำหรับแอปพลิเคชันของคุณคือการเขียนหน้าจอหลักทดแทนโดยใช้ android.intent.category.HOME Intent ฉันเชื่อว่าเจตนาประเภทนี้คุณจะเห็นปุ่มโฮม

รายละเอียดเพิ่มเติม:

http://developer.android.com/guide/topics/intents/intents-filters.html#imatch


1
ความคิดที่น่าสนใจ แต่ยาวไปหน่อยและไม่สวยหรูอย่างที่หวังไว้
Dean Wild

0

เนื่องจากคุณต้องการให้แสดงกิจกรรมรูทอีกครั้งเมื่อเปิดตัวแอปเท่านั้นคุณอาจได้รับพฤติกรรมนี้โดยเปลี่ยนโหมดการเปิดตัว ฯลฯ ในไฟล์ Manifest?

ตัวอย่างเช่นคุณได้ลองใช้แอตทริบิวต์android: clearTaskOnLaunch = "true"กับกิจกรรมการเปิดตัวของคุณหรือไม่หรืออาจใช้ควบคู่กับandroid: launchMode = "singleInstance"

Tasks และ Back Stackเป็นแหล่งข้อมูลที่ยอดเยี่ยมสำหรับการปรับแต่งพฤติกรรมประเภทนี้อย่างละเอียด


นี่ดูเหมือนจะเป็นวิธีแก้ปัญหาที่หรูหราที่สุด แต่ฉันพบว่ามันค่อนข้างไม่น่าเชื่อถือ หลังจากเปิด / ปิด / หยุดชั่วคราวไม่กี่รอบแอปจะเริ่มทำงานต่อแทนที่จะรีสตาร์ทโดยสมบูรณ์
Dean Wild

0

การเปลี่ยนพฤติกรรมของกุญแจบ้านเป็นความคิดที่ไม่ดี นี่คือสาเหตุที่ Google ไม่อนุญาตให้คุณแทนที่คีย์บ้าน ฉันจะไม่ยุ่งกับคีย์บ้านที่พูดโดยทั่วไป คุณต้องให้วิธีผู้ใช้ออกจากแอปของคุณหากแอปหลุดไปในวัชพืชไม่ว่าด้วยเหตุผลใดก็ตาม

ฉันคิดว่าการแก้ปัญหาใด ๆ จะมีผลข้างเคียงที่ไม่ต้องการ


1
คุณมองเห็นได้ชัดเจน แต่ลูกค้าบางรายจะไม่รับคำตอบและไม่เข้าใจว่าทำไมพวกเขาไม่ควรฝ่าฝืนหลักเกณฑ์
Dean Wild

ปัญหาคือแม้ว่าคุณจะไม่ต้องการเปลี่ยนพฤติกรรมของปุ่มโฮม แต่บางครั้งคุณก็ต้องตอบสนองแตกต่างกันไปในสถานการณ์ที่แอปพลิเคชันถูกย้ายไปด้านหลังเนื่องจากการกดปุ่มโฮมแตกต่างจากสถานการณ์ที่คุณหยุดกิจกรรมปัจจุบันไว้ชั่วคราวเพื่อเฝ้าดู เหตุผล. ปัญหาเดียวกันคือการที่ Application.onDestroy () ไม่สามารถใช้สำหรับการสร้าง poduction ตัวอย่างดังกล่าวกำลังหยุดเกมชั่วคราวเมื่อผู้ใช้ซ่อน
แอปพลิเคชั่น

0

เมื่อเร็ว ๆ นี้ฉันพยายามตรวจจับปุ่มกดโฮมเพราะฉันต้องการให้มันทำเช่นเดียวกับวิธีการ " onBackPressed () " ในการดำเนินการนี้ฉันต้องแทนที่เมธอด " onSupportNavigateUp () " ดังนี้:

override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}

มันทำงานได้อย่างสมบูรณ์แบบ =)


0

คำตอบของแจ็คทำงานได้อย่างสมบูรณ์แบบสำหรับclickเหตุการณ์ในขณะที่longClickกำลังพิจารณาคือการmenuคลิกปุ่ม

ยังไงก็ตามถ้าใครสงสัยว่าจะทำอย่างไรผ่าน kotlin

class HomeButtonReceiver(private var context: Context,private var listener: OnHomeButtonClickListener) {
    private val mFilter: IntentFilter = IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)
    private var mReceiver: InnerReceiver = InnerReceiver()

    fun startWatch() {
        context.registerReceiver(mReceiver, mFilter)
    }

    fun stopWatch() {
        context.unregisterReceiver(mReceiver)
    }

    inner class InnerReceiver: BroadcastReceiver() {
        private val systemDialogReasonKey = "reason"
        private val systemDialogReasonHomeKey = "homekey"
        override fun onReceive(context: Context?, intent: Intent?) {
            val action = intent?.action
            if (action == Intent.ACTION_CLOSE_SYSTEM_DIALOGS) {
                val reason = intent.getStringExtra(systemDialogReasonKey)
                if (reason != null && reason == systemDialogReasonHomeKey) {
                    listener.onHomeButtonClick()
                }
            }
        }
    } 
}

0

ป้อนคำอธิบายภาพที่นี่ Android Home Key ที่จัดการโดยเลเยอร์เฟรมเวิร์กซึ่งคุณไม่สามารถจัดการสิ่งนี้ได้ในระดับเลเยอร์แอปพลิเคชัน เนื่องจากการทำงานของปุ่มโฮมถูกกำหนดไว้แล้วในระดับด้านล่าง แต่หากคุณกำลังพัฒนา ROM แบบกำหนดเองอาจเป็นไปได้ Google จำกัด ฟังก์ชันการแทนที่ HOME BUTTON เนื่องจากเหตุผลด้านความปลอดภัย


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.