ฉันต้องการทราบว่าผู้ใช้จะกลับไปที่หน้าจอหลักหรือไม่หากเขาออกจากกิจกรรมปัจจุบัน
ฉันต้องการทราบว่าผู้ใช้จะกลับไปที่หน้าจอหลักหรือไม่หากเขาออกจากกิจกรรมปัจจุบัน
คำตอบ:
UPDATE (ก.ค. 2558):
เนื่องจากgetRunningTasks ()เลิกใช้งานแล้วจาก API 21 จะดีกว่าถ้าทำตามคำตอบraukodraug หรือEd Burnette one (ฉันชอบอันที่สองมากกว่า)
มีความเป็นไปเพื่อตรวจสอบงานในปัจจุบันและสแต็คของพวกเขาใช้เป็นActivityManager
ดังนั้นเพื่อตรวจสอบว่ากิจกรรมเป็นกิจกรรมสุดท้ายหรือไม่:
ใช้รหัสต่อไปนี้:
ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);
if(taskList.get(0).numActivities == 1 &&
taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) {
Log.i(TAG, "This is last activity in the stack");
}
โปรดทราบว่าโค้ดด้านบนจะใช้ได้เฉพาะในกรณีที่คุณมีงานเดียว หากมีความเป็นไปได้ที่จะมีงานจำนวนมากสำหรับแอปพลิเคชันของคุณคุณจะต้องตรวจสอบองค์ประกอบtaskListอื่น ๆ อ่านเพิ่มเติมเกี่ยวกับงานTasks และ Back Stack
isTaskRoot()
วิธีการ
ฉันจะโพสต์ความคิดเห็นของ@ H9kDroidเป็นคำตอบที่ดีที่สุดสำหรับผู้ที่มีคำถามคล้ายกัน
คุณสามารถใช้isTaskRoot ()เพื่อทราบว่ากิจกรรมนั้นเป็นรากฐานของงานหรือไม่
ฉันหวังว่านี่จะช่วยได้
if (isTaskRoot()) { // do something }
หวังว่านี่จะช่วยผู้เริ่มต้นใหม่จากคำตอบข้างต้นซึ่งใช้ได้ผลดีสำหรับฉันฉันกำลังแชร์ข้อมูลโค้ดเพื่อให้ง่ายต่อการนำไปใช้
วิธีแก้ปัญหา:ฉันใช้isTaskRoot()
ซึ่งส่งคืนจริงหากกิจกรรมปัจจุบันเป็นเพียงกิจกรรมในสแต็กของคุณและนอกเหนือจากฉันยังจัดการกรณีที่หากฉันมีกิจกรรมบางอย่างในสแต็กให้ไปที่กิจกรรมสุดท้ายในสแต็กแทนที่จะเปิดกิจกรรมที่กำหนดเองใหม่
ในกิจกรรมของคุณ
@Override
public void onBackPressed() {
if(isTaskRoot()){
startActivity(new Intent(currentActivityName.this,ActivityNameYouWantToOpen.class));
// using finish() is optional, use it if you do not want to keep currentActivity in stack
finish();
}else{
super.onBackPressed();
}
}
มีวิธีแก้ปัญหาที่ง่ายที่สุดคุณสามารถใช้isTaskRoot () ในกิจกรรมของคุณ
แม้ว่าอาจมีวิธีที่จะบรรลุเป้าหมายนี้ได้ (ดูคำตอบอื่น ๆ ) ฉันขอแนะนำว่าคุณไม่ควรทำเช่นนั้น แอปพลิเคชัน Android ปกติไม่จำเป็นต้องรู้ว่าหน้าจอหลักกำลังจะแสดงหรือไม่
หากคุณกำลังพยายามบันทึกข้อมูลให้ใส่รหัสประหยัดข้อมูลในเมธอด onPause () หากคุณกำลังพยายามให้ผู้ใช้เปลี่ยนใจเกี่ยวกับแอปพลิเคชันที่มีอยู่คุณสามารถสกัดกั้นคีย์ขึ้น / ลงสำหรับปุ่มย้อนกลับและวิธี onBackPressed () และนำเสนอด้วยข้อความ "คุณแน่ใจหรือไม่" รวดเร็ว
วิธีหนึ่งในการติดตามสิ่งนี้คือการใส่เครื่องหมายเมื่อคุณเริ่มกิจกรรมใหม่และตรวจสอบว่ามีเครื่องหมายอยู่หรือไม่
เมื่อใดก็ตามที่คุณเริ่มกิจกรรมใหม่ให้ใส่เครื่องหมาย:
newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);
จากนั้นคุณสามารถตรวจสอบได้ดังนี้:
boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")
ปัญหาในการแก้ปัญหาของ sandrstar ActivityManager
คือคุณต้องได้รับอนุญาตเพื่อรับงานด้วยวิธีนี้ ฉันพบวิธีที่ดีกว่า:
getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
Activity
ด้านล่างกอง allways ควรจะได้รับหมวดหมู่นี้โดยเริ่มต้นในขณะที่กิจกรรมอื่น ๆ ที่ไม่ควรจะได้รับ
แต่แม้ว่าสิ่งนี้จะล้มเหลวในบางอุปกรณ์คุณสามารถตั้งค่าได้ในขณะที่เริ่มActivity
:
Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);
ฉันได้สร้างคลาสพื้นฐานสำหรับกิจกรรมทั้งหมดของฉันขยายAppCompatActivityและซึ่งมีตัวนับแบบคงที่:
public abstract class BasicActivity extends AppCompatActivity {
private static int activityCounter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
++activityCounter;
...
}
@Override
public void onDestroy() {
super.onDestroy();
--activityCounter;
if(activityCounter==0) {
// Last instance code...
}
}
public boolean isLastInstance() { return (activityCounter==1); }
}
สิ่งนี้ได้ผลดีพอสมควรแล้ว และไม่คำนึงถึงเวอร์ชัน API แน่นอนว่ากิจกรรมทั้งหมดจะต้องขยายคลาสพื้นฐานนี้ซึ่งในกรณีของฉัน
แก้ไข:ฉันสังเกตเห็นอินสแตนซ์หนึ่งเมื่อตัวนับลดลงเป็นศูนย์ก่อนที่แอปจะออกอย่างสมบูรณ์ซึ่งก็คือเมื่อมีการเปลี่ยนการวางแนวและเปิดเพียงกิจกรรมเดียวเท่านั้น เมื่อการวางแนวเปลี่ยนไปกิจกรรมจะถูกปิดและอีกกิจกรรมหนึ่งถูกสร้างขึ้นดังนั้นจึงonDestroyed
ถูกเรียกสำหรับกิจกรรมสุดท้ายจากนั้นonCreate
จะถูกเรียกเมื่อกิจกรรมเดียวกันถูกสร้างขึ้นพร้อมกับการวางแนวที่เปลี่ยนไป พฤติกรรมนี้ต้องได้รับการพิจารณา; อาจใช้OrientationEventListener
การดำเนินการของ Android กองกิจกรรม, ผมขอแนะนำให้คุณอ่านเกี่ยวกับเรื่องนี้ที่นี่ getCallingActivity()
ดูเหมือนว่าสิ่งที่คุณต้องการจะทำก็คือดึงกิจกรรมโทร: หากกิจกรรมปัจจุบันเป็นกิจกรรมแรกในใบสมัครของคุณและการประยุกต์ใช้เปิดตัวจากหน้าจอที่บ้านก็ควร (ฉันคิด) null
ผลตอบแทน
สิ่งหนึ่งที่พลาดไปที่นี่คือการคลิก "ปุ่มหน้าแรก" เมื่อเปิดใช้งานคุณจะไม่สามารถตรวจพบสิ่งนี้จากกิจกรรมของคุณได้ดังนั้นจึงควรควบคุมสแต็กกิจกรรมทางโปรแกรมด้วยการจัดการกด "ปุ่มย้อนกลับ" และย้ายไปยังกิจกรรมที่ต้องการหรือ เพียงทำตามขั้นตอนที่จำเป็น
นอกจากนี้คุณไม่แน่ใจว่าการเริ่มต้นกิจกรรมของคุณจากรายการ "กิจกรรมล่าสุด" สามารถตรวจพบได้ด้วยการตั้งค่าข้อมูลพิเศษบางอย่างไว้ล่วงหน้าเพื่อวัตถุประสงค์ในการเปิดกิจกรรมเนื่องจากจะถูกนำกลับมาใช้ในกรณีนั้น