android:clearTaskOnLaunch ไม่ทำงาน จะล้าง backstack เมื่ออยู่เบื้องหน้าได้อย่างไร

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

  1. S - หน้าจอเริ่มต้น
  2. L - หน้าจอกำลังโหลด
  3. หล่อ - หน้าจอเข้าสู่ระบบ
  4. M - เมนูหลัก (มีรายการงาน)
  5. T - หน้าจองาน

"ผู้ใช้เริ่มต้นแอปและดำเนินการตามลำดับต่อไปนี้: S -> L -> แท้จริง (เข้าสู่ระบบ) -> M (เลือกงานใดงานหนึ่ง) -> หน้าจองาน

  • ดังนั้นในขณะที่เขาอยู่ในหน้าจองาน เขากดปุ่มโฮม จากนั้นแอปจะไปที่พื้นหลังและเขาก็ใช้แอปอื่น และเปิดแอป Foo อีกครั้ง ดังนั้นหากเขากดปุ่ม Back จะแสดง Task Screen ที่เคยใช้งานก่อนหน้านี้??? และถ้ากดปุ่ม Back อีกครั้ง มันจะไปที่ หน้าจอหลัก อีกครั้ง และอื่นๆ...???

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

หมายเหตุ: หน้าจอทั้งหมดได้ขยายคลาส BaseActivity ซึ่งได้ขยายคลาสกิจกรรม และในนั้นฉันได้ใช้เมธอด onResume(),onPause() และเมธอดที่กำหนดเองอื่นเพื่อดูว่าเมื่อใดที่คลาสลูกขยายหยุดชั่วคราวและกลับมาทำงานต่อเมื่อแอปมาจากพื้นหลัง!!! และในบางหน้าจอฉันก็ต้องใช้ Fragments ด้วย...!

ขอขอบคุณล่วงหน้าสำหรับเวลาและความช่วยเหลือของคุณ!


person Randika Vishman    schedule 14.06.2013    source แหล่งที่มา
comment
Downvoted เนื่องจากซ้ำกัน ที่นี่ (คำตอบที่ดีมาก btw) และที่นี่   -  person verybadalloc    schedule 14.06.2013
comment
หากผู้ใช้กดหน้าแรกหรือกิจกรรมอื่น ๆ อยู่ด้านบน (หมายเลขโทรเข้า) จากนั้นเมื่อผู้ใช้กลับไปที่กิจกรรมของคุณ (โดยไอคอนแอปพลิเคชันหรือด้านหลัง) เขาควรจะมองเห็นแอปของคุณว่าอยู่ที่ไหน ฉันไม่เห็นแอป Android ที่จริงจังและเป็นที่นิยมที่มีพฤติกรรมแตกต่างออกไป ... ฉันไม่เห็นเหตุผลว่าทำไมจึงไม่ควรทำงานเช่นนี้   -  person gunar    schedule 14.06.2013
comment
ขอบคุณสำหรับความคิดเห็นทั้งสองในตอนแรก @verybadalloc เฮ้ ฉันก็เลยตอบแบบนั้นก่อนที่ฉันจะโพสต์สิ่งนี้ แต่สิ่งที่ฉันได้นำไปใช้ในแอปของฉัน แต่ไม่ได้ให้ผลลัพธ์ที่ต้องการ! :(   -  person Randika Vishman    schedule 15.06.2013
comment
@gunar สวัสดี Gunar หากคุณจินตนาการถึงแอปหนึ่ง ซึ่งคุณสามารถซ่อนหรือล็อครูปภาพทั้งหมดที่คุณเลือกผ่านแอปได้ และเมื่อใดก็ตามที่คุณต้องการเข้าถึงรูปภาพเหล่านั้น คุณจะต้องเข้าสู่ระบบผ่านแอป แต่ไม่ได้อยู่ภายในแกลเลอรีรูปภาพที่ดูล่าสุดของแอปนั้นโดยตรง ดังนั้นเพื่อที่จะนำพฤติกรรมแบบนั้นไปใช้ เราจำเป็นต้องนำสถานการณ์ที่กล่าวมาข้างต้นมาใช้งาน   -  person Randika Vishman    schedule 15.06.2013
comment
เมื่อ Activity backStack เป็นดังนี้ A -› B -› C -› D และเมื่อผู้ใช้เป็น ใน D เขากดปุ่มหน้าแรก ไม่ว่าจะด้วยวิธีใดก็ตามที่เขาเปิดแอปอีกครั้งในภายหลัง ฉันอยากให้เขากลับไปที่กิจกรรม A เช่น การป๊อปกลับสแต็กแบบง่ายๆ มากถึง A!เนื่องจากเป็น กิจกรรมการเข้าสู่ระบบ ฉันจึงยังไม่สามารถเข้าถึงสิ่งนี้ได้! ฉันสามารถค้นหาได้ทุกที่ในแอปว่าเมื่อมันกลับมาจากพื้นหลังเป็นเบื้องหน้าและส่งวิธี Intent to StartActivity ด้วย FLAG_ACTIVITY_CLEAR_TASK และฉันใช้ **android:clearTaskOnLaunch=true ** แล้ว แต่ก็ยัง ปัญหาอยู่ตรงนั้น!   -  person Randika Vishman    schedule 17.06.2013


คำตอบ (2)


เพิ่มแท็ก android:clearTaskOnLaunch="true" ให้กับแท็กกิจกรรมรูท (หลัก) ในรายการ จากนั้นผู้ใช้จะกลับมาที่กิจกรรมนี้เสมอ

หากต้องการข้ามไปยังการเข้าสู่ระบบจากกิจกรรมอื่น ให้ใช้:

public static void logoff(Context c){
    Intent logoff = new Intent(c,LoginActivity.class);
    logoff.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
    c.startActivity(logoff);
}
person S.D.    schedule 14.06.2013
comment
สวัสดี ขอบคุณสำหรับการตอบกลับ ฉันเดาว่าฉันได้ทำสิ่งเดียวกันแล้ว แต่จริงๆ แล้วมันไม่ได้ผล!อย่างไรก็ตาม อะไรคือสาเหตุของการสร้างวิธีการแบบคงที่ แล้วเมื่อไหร่จะเรียกแบบนี้ล่ะ? คำถามของผมก็คือ จริงๆ แล้วผมก็ทำแบบเดียวกัน และเริ่มต้นกิจกรรมการเข้าสู่ระบบใหม่ได้สำเร็จหรือสามารถไปที่หน้าจอ Splash Screen ได้ แต่ปัญหาอยู่ที่จุดนั้นหาก User กดปุ่ม Back เขา/เธอก็ยังสามารถเข้าถึง กิจกรรมก่อนหน้าบนหลังซึ่งเขาใช้ในครั้งสุดท้ายที่เขาใช้มัน! :( (จำเป็นต้องมีพฤติกรรมนี้เพื่อหลีกเลี่ยงการปกป้องข้อมูลภายในแอป) ความช่วยเหลือใด ๆ - person Randika Vishman; 15.06.2013
comment
@Vishman เมธอด logoff จะทำตามที่กล่าวไว้ โดยจะนำผู้ใช้กลับไปยังกิจกรรมการเข้าสู่ระบบจากกิจกรรมอื่น ๆ และผู้ใช้ไม่สามารถยกเลิกการดำเนินการนี้ได้โดยการกดกลับ เนื่องจากจะเป็นการสิ้นสุดงานเก่าและเริ่มงานใหม่ นี่เป็นแบบคงที่จึงสามารถโทรได้ง่ายจากทุกที่ ตอนนี้ การเพิ่ม android:clearTaskOnLaunch="true" ลงในกิจกรรมการเข้าสู่ระบบในรายการจะช่วยให้แน่ใจว่าเมื่อผู้ใช้ไปที่ใดที่หนึ่งและกลับมาที่แอป เขามาที่กิจกรรมการเข้าสู่ระบบและอยู่ในงานใหม่ที่รีเฟรช (เช่นเดียวกับวิธีการ logoff) นอกจากนี้ ฉันขอแนะนำให้ใช้ Fragments และวาง Splash/ กำลังโหลด/เข้าสู่ระบบส่วนย่อยในกิจกรรมการเข้าสู่ระบบเท่านั้น - person S.D.; 16.06.2013
comment
สวัสดี ขอบคุณสำหรับคำอธิบาย ฉันจะลองทำสิ่งนี้และแจ้งผลลัพธ์ให้คุณทราบ ตกลงไหม - person Randika Vishman; 17.06.2013
comment
เมื่อ Activity backStack เป็นดังนี้ A -› B -› C -› D และเมื่อผู้ใช้เป็น ใน D เขากดปุ่มหน้าแรก ไม่ว่าจะด้วยวิธีใดก็ตามที่เขาเปิดแอปอีกครั้งในภายหลัง ฉันอยากให้เขากลับไปที่กิจกรรม A เช่น การป๊อปกลับสแต็กแบบง่ายๆ มากถึง A!เนื่องจากเป็น กิจกรรมการเข้าสู่ระบบ ฉันจึงยังไม่สามารถเข้าถึงสิ่งนี้ได้! ฉันสามารถค้นหาได้ทุกที่ในแอปว่าเมื่อมันกลับมาจากพื้นหลังเป็นเบื้องหน้าและส่งวิธี Intent to StartActivity ด้วย FLAG_ACTIVITY_CLEAR_TASK และฉันใช้ **android:clearTaskOnLaunch=true ** แล้ว แต่ก็ยัง ปัญหาอยู่ตรงนั้น! - person Randika Vishman; 17.06.2013
comment
ฉันขอโทษนะ แต่มันโง่ไปหน่อยที่จะพูด แต่ฉันพบวิธีแก้ปัญหาครึ่งทางสำหรับคำถามของฉันโดยรับความช่วยเหลือจาก คำตอบต่อไปนี้ หวังว่านี่จะเป็นประโยชน์กับคุณทุกคนในกรณีที่คุณพบคำถามเดียวกัน - person Randika Vishman; 12.07.2013

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

แทนที่ Lo, M และ T เป็นส่วนย่อย ดังนั้นหลังจาก L คุณจะมีกิจกรรม (PostL) ที่คุณแสดงส่วน Lo ส่วนแรก จากนั้นเมื่อผู้ใช้ดำเนินการ คุณจะเพิ่มไว้ด้านบนของ Lo ส่วน M คูณด้วย get(Supported)FragmentManager.beginTransation().add(id, fragment).commit() จากนั้นดำเนินการต่อคุณจะแทนที่ M ด้วย T: get(Supported)FragmentManager.beginTransation().replace(id, fragment).commit() - หรือจะเติม T ทับ M ก็ได้ แล้วแต่คุณจะเลือก เพราะอาจจะเหมาะกับชุดมากกว่า

ในกิจกรรม PostL นี้ ในเมธอด onPause() คุณจะเรียกเฉพาะ get(Supported)FragmentManager.popBackStack() ถ้าแฟรกเมนต์ backstack ประกอบด้วยมากกว่าหนึ่งแฟรกเมนต์ - แฟรกเมนต์ด้านล่างคือ Lo

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

ฉันหวังว่ามันจะสมเหตุสมผล ...

person gunar    schedule 16.06.2013
comment
อ้อ ขอบคุณสำหรับข้อเสนอแนะของคุณก่อน แต่ดูเหมือนว่าการเปลี่ยนแปลงการพัฒนาสาขาใหม่ทั้งหมดซึ่งปัจจุบันฉันมีผลิตภัณฑ์สำเร็จรูปส่วนใหญ่แล้ว อย่างไรก็ตาม ขอขอบคุณ และหากฉันไม่สามารถแก้ไขปัญหานี้ด้วยวิธีอื่นได้ ฉันจะลองวิธีแก้ปัญหานี้ด้วย และฉันจะแจ้งให้คุณทราบอย่างแน่นอนว่าเกิดอะไรขึ้น โอเค :) ขอบคุณอีกครั้ง! - person Randika Vishman; 17.06.2013
comment
คุณไม่ควรมีงานทำ เนื่องจากการย้าย Activity ไปยัง Fragment และในทางกลับกันทำได้ค่อนข้างง่าย วงจรชีวิตของพวกมันคล้ายกันมาก การโทรกลับก็คล้ายกัน ดังนั้นคุณไม่ควรมีงานมากเกินไป คุณสามารถจัดสรรเวลาได้ เช่น 2 ชั่วโมงสำหรับสิ่งนี้ ถ้ามันได้ผล ก็โอเค แต่ถ้าไม่ได้ คุณก็ปล่อยไว้เหมือนเดิมก็ได้ - person gunar; 17.06.2013
comment
ขอบคุณสำหรับความช่วยเหลือ! ดังนั้นหากฉันจะใช้โซลูชันนี้ ฉันจะต้องย้ายงานอื่นๆ ทั้งหมดจากกิจกรรมไปเป็นแบบแฟรกเมนต์ใช่ไหม ถ้าไม่ทำอีกก็จะเกิดปัญหาตามมาในภายหลัง - person Randika Vishman; 17.06.2013
comment
ฉันขอโทษนะ แต่มันโง่ไปหน่อยที่จะพูด แต่ฉันพบวิธีแก้ปัญหาครึ่งทางสำหรับคำถามของฉันโดยรับความช่วยเหลือจาก คำตอบต่อไปนี้ หวังว่านี่จะเป็นประโยชน์กับคุณทุกคนในกรณีที่คุณพบคำถามเดียวกัน - person Randika Vishman; 12.07.2013
comment
ดูความคิดเห็นของ Radu จากคำตอบนั้น นั่นเป็นวิธีที่แฮ็กโดยไม่ทำอะไรเลย - person gunar; 12.07.2013
comment
นั่นเป็นเรื่องจริงเมื่อเราเห็นมันได้อย่างรวดเร็ว แต่อย่างไรก็ตาม จากคำตอบนั้น ฉันใช้วิธีการที่กำหนดเองเพื่อตรวจสอบว่ามันมาจากพื้นหลังเมื่อใด และคำตอบที่ฉันให้ลิงก์ไปนั้น ฉันแก้ไขปัญหาได้เพียงครึ่งเดียวเท่านั้น ตำแหน่งที่ผู้ใช้คลิกที่ไอคอนแอปและแอปปรากฏอยู่เบื้องหน้าอย่างน่าประหลาดใจที่แบ็คสแต็กถูกล้างออกไป แต่หากผู้ใช้เข้าถึงภายในแอปล่าสุด ปัญหาเดิมยังคงอยู่ นั่นคือผู้ใช้สามารถเข้าถึงกิจกรรมก่อนหน้านี้ได้ :( ไม่อยากจำเรื่องปวดหัวด้วยซ้ำ!!! - person Randika Vishman; 12.07.2013