แทนที่ปุ่มย้อนกลับเพื่อทำหน้าที่เหมือนปุ่มโฮม


253

เมื่อกดปุ่มย้อนกลับฉันต้องการให้แอปพลิเคชันของฉันเข้าสู่สถานะหยุดทำงานแทนที่จะเป็นสถานะที่ถูกทำลาย

ในเอกสาร Android มันระบุ:

... ไม่ใช่ทุกกิจกรรมที่มีพฤติกรรมที่ถูกทำลายเมื่อกด BACK เมื่อผู้ใช้เริ่มเล่นเพลงในแอปพลิเคชั่น Music แล้วกด BACK แอพพลิเคชั่นจะแทนที่พฤติกรรมปกติหลังป้องกันไม่ให้กิจกรรมของผู้เล่นถูกทำลายและเล่นเพลงต่อไปแม้ว่ากิจกรรมจะไม่ปรากฏให้เห็นอีกต่อไป

ฉันจะทำซ้ำฟังก์ชั่นนี้ในแอปพลิเคชันของตัวเองได้อย่างไร

ฉันคิดว่าต้องมีความเป็นไปได้สามอย่าง ...

  1. จับปุ่มย้อนกลับกด (ตามด้านล่าง) แล้วเรียกวิธีการใด ๆ ที่ปุ่มโฮมเรียก

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            Log.d(this.getClass().getName(), "back button pressed");
        }
        return super.onKeyDown(keyCode, event);
    }
  2. จับการกดปุ่มย้อนกลับจากนั้นหลอกการกดปุ่มโฮม

  3. บันทึกการกดปุ่มย้อนกลับจากนั้นเริ่มกิจกรรมของหน้าจอหลักทำให้กิจกรรมของแอปพลิเคชันของฉันเข้าสู่สถานะหยุดทำงานได้อย่างมีประสิทธิภาพ

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


ดูคำตอบที่คล้ายกันstackoverflow.com/questions/5914040/...
ซาร์ E Ahmer

คำตอบ:


338

ส่วนใหญ่เวลาที่คุณต้องการในการสร้างบริการที่จะดำเนินการอะไรบางอย่างในพื้นหลังและคุณมองเห็นเพียงแค่การควบคุมนี้Activity Service(ฉันแน่ใจว่าเครื่องเล่นเพลงทำงานในลักษณะเดียวกันดังนั้นตัวอย่างในเอกสารดูเหมือนจะทำให้เข้าใจผิดเล็กน้อย) หากเป็นเช่นนั้นคุณActivityสามารถทำได้finishตามปกติและServiceจะยังคงทำงานอยู่

วิธีที่ง่ายกว่าคือการจับBackปุ่มกดและเรียกใช้moveTaskToBack (true)ดังต่อไปนี้:

// 2.0 and above
@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

// Before 2.0
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

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

หมายเหตุ : ดังที่เดฟระบุไว้ด้านล่าง Android 2.0 ได้แนะนำonBackPressedวิธีการใหม่และคำแนะนำเหล่านี้เกี่ยวกับวิธีจัดการกับปุ่มย้อนกลับ


1
moveTaskToBack () ดูเหมือนว่าจะทำงานได้ตามที่ต้องการ ข้อเสียของการใช้วิธีนี้คืออะไร? มีกรณีที่สิ่งนี้อาจไม่ทำงานตามที่คาดไว้หรือไม่
bdls

1
หลังจากอ่านเอกสารอย่างละเอียดฉันคิดว่ามันน่าจะใช้ได้ดี (ตอนแรกฉันคิดว่ามันใช้กับกิจกรรม แต่อันที่จริงแล้วมันบอกว่า "งานที่มีกิจกรรมนี้") แต่คุณควรทดสอบด้วยตัวคุณเองแน่นอน :)
Mirko N.

ขอบคุณ Mirko วิธีนี้ใช้ได้ผลดี มันอาจจะเจ๋งถ้าคุณให้ความสำคัญกับการแก้ไขของคุณมากขึ้นที่ด้านล่างของคำตอบของคุณสำหรับผู้ที่มองคำถามนี้ในภายหลัง - นั่นเป็นสิ่งที่ฉันกำลังมองหา!
bdls

4
โปรดอ่านandroid-developers.blogspot.com/2009/12/…สำหรับวิธีที่แนะนำในการจัดการปุ่มย้อนกลับ
hackbod

1
@bdls ตามทฤษฎีกิจกรรมพื้นหลังของคุณอาจถูกฆ่าโดยระบบหากทรัพยากรเหลือน้อยดังนั้นเพื่อความปลอดภัยคุณควรสร้างตัวเองใหม่ได้ ฉันได้ดูซอร์สโค้ดสำหรับแอพ Android Music และไม่เห็นปุ่มจัดการกลับพิเศษ
Mirko N.

46

ใช้รหัสต่อไปนี้:

public void onBackPressed() {    
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
}

23

หากคุณต้องการที่จะจับปุ่มย้อนกลับมีลักษณะที่โพสต์นี้ใน Android บล็อกของนักพัฒนา มันครอบคลุมวิธีที่ง่ายกว่าในการทำเช่นนี้ใน Android 2.0 และวิธีที่ดีที่สุดในการทำเช่นนี้สำหรับแอปพลิเคชันที่รันบน 1.x และ 2.0

อย่างไรก็ตามหากกิจกรรมของคุณหยุดลงก็ยังอาจถูกฆ่าทั้งนี้ขึ้นอยู่กับความพร้อมใช้งานของหน่วยความจำในอุปกรณ์ หากคุณต้องการกระบวนการที่จะทำงานกับไม่มี UI Serviceคุณควรสร้าง เอกสารอธิบายเกี่ยวกับบริการต่าง ๆ ดังต่อไปนี้:

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

สิ่งเหล่านี้ดูเหมือนจะเหมาะสมกับความต้องการของคุณ



14

ถ้ามันช่วยคนอื่นฉันมีกิจกรรมที่มีเลย์เอาต์ 2 แบบที่ฉันเปิดและปิดเพื่อให้มองเห็นได้โดยพยายามเลียนแบบโครงสร้างของ page1> page2 หากพวกเขาอยู่ในหน้า 2 และกดปุ่มย้อนกลับฉันต้องการให้พวกเขากลับไปที่หน้า 1 หากพวกเขากดปุ่มย้อนกลับในหน้า 1 มันก็ยังทำงานได้ตามปกติ มันค่อนข้างพื้นฐาน แต่ใช้งานได้

@Override
public void onBackPressed() {
// check if page 2 is open
    RelativeLayout page2layout = (RelativeLayout)findViewById(R.id.page2layout);
    if(page2layout.getVisibility() == View.VISIBLE){
        togglePageLayout(); // my method to toggle the views
        return;
    }else{
        super.onBackPressed(); // allows standard use of backbutton for page 1
    }

}

หวังว่ามันจะช่วยใครซักคนไชโย


10

ตัวอย่างการทำงาน ..

ตรวจสอบให้แน่ใจว่าไม่ได้เรียก super.onBackPressed ();

@Override
public void onBackPressed() {
   Log.d("CDA", "onBackPressed Called");
   Intent setIntent = new Intent(Intent.ACTION_MAIN);
   setIntent.addCategory(Intent.CATEGORY_HOME);
   setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   startActivity(setIntent);
}

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

วิธีที่สองคือการโทร moveTaskToBack(true);เข้าonBackPressedและให้แน่ใจว่าจะลบsuper.onBackPressed


0

ดียิ่งขึ้นวิธีการเกี่ยวกับOnPause () :

เรียกว่าเป็นส่วนหนึ่งของวงจรชีวิตของกิจกรรมเมื่อกิจกรรมเข้าสู่พื้นหลัง แต่ยังไม่ถูกฆ่า (ยัง) คู่กับ onResume ()

เมื่อกิจกรรม B เปิดตัวต่อหน้ากิจกรรม A การเรียกกลับนี้จะถูกเรียกใช้บน A. B จะไม่ถูกสร้างขึ้นจนกว่า A ของ onPause () จะกลับมาดังนั้นenter code hereอย่าทำอะไรเลยที่นี่

การเรียกกลับนี้ส่วนใหญ่จะใช้สำหรับการบันทึกสถานะถาวรใด ๆ ที่กิจกรรมกำลังแก้ไขและทำให้แน่ใจว่าไม่มีอะไรหายไปถ้ามีทรัพยากรไม่เพียงพอที่จะเริ่มกิจกรรมใหม่โดยไม่ต้องฆ่าคนนี้ก่อน

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


0

แทนที่ onBackPressed () หลังจาก Android 2.0 เช่น

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

0

ฉันได้ลองวิธีแก้ไขปัญหาทั้งหมดข้างต้นแล้ว แต่ไม่มีวิธีใดที่ทำงานให้ฉันได้ รหัสต่อไปนี้ช่วยฉันเมื่อพยายามกลับไปที่ MainActivity ในวิธีที่ onCreate ถูกเรียก:

เจตนา. FLAG_ACTIVITY_CLEAR_TOP เป็นกุญแจสำคัญ

  @Override
  public void onBackPressed() {
      Intent intent = new Intent(this, MainActivity.class);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
      startActivity(intent);
  }

-1

ฉันได้ใช้ @Mirko N. ผู้ตอบรับโดยใช้ EditText แบบกำหนดเองใหม่

 public class EditViewCustom extends EditText {

    Button cancelBtn;
    RelativeLayout titleReleLayout;
    public EditViewCustom(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public EditViewCustom(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditViewCustom(Context context) {
        super(context);
    }

    public void setViews(Button cancelBtn,RelativeLayout titleReleLayout){
        this.cancelBtn = cancelBtn;
        this.titleReleLayout = titleReleLayout;
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            Log.d("KEYCODE_BACK","KEYCODE_BACK");
            cancelBtn.setVisibility(View.GONE);
            this.setFocusableInTouchMode(false);
            this.setFocusable(false);
            titleReleLayout.setVisibility(View.VISIBLE);

            return super.onKeyPreIme(keyCode, event);
          }

        return super.onKeyPreIme(keyCode, event);
    }

}

จากนั้นตั้งค่าข้อมูลจากกิจกรรมของคุณ

 searchEditView.setViews(cancelBtn, titleRelativeLayout);

ขอบคุณ.

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