โหลดกิจกรรมใหม่ใน Android


221

เป็นวิธีปฏิบัติที่ดีในการโหลดซ้ำActivityในAndroidหรือไม่

อะไรจะเป็นวิธีที่ดีที่สุดที่จะทำ? this.finishแล้วthis.startActivityกับกิจกรรมIntent?


3
ฉันไม่ใช่นักพัฒนา Android ที่มีประสบการณ์ แต่การเริ่มต้นกิจกรรมใหม่ดูเหมือนการออกแบบไม่ดีและควรทำในกรณีที่รุนแรงเท่านั้น
ฮัดสัน

@Hudson มันเกิดอะไรขึ้นกับการเปลี่ยนแปลงการกำหนดค่า ถ้านั่นเป็นการออกแบบที่ดีหรือไม่ก็เป็นการสนทนาอื่นทั้งหมด ;)
hpique

1
@Hudson คุณเป็นนักพัฒนาที่มีประสบการณ์ 5 ปีแล้ว: D
Pratik Butani

@PratikButani ฉันรู้จักคุณไหม :) ตอนนี้ฉันมีประสบการณ์ 8 ปี แต่ไม่มากในการพัฒนา Android
ฮัดสัน

คุณเข้าเยี่ยมชมโปรไฟล์ของฉันฉันรู้: P @Hudson
Pratik Butani

คำตอบ:


521

คุณสามารถใช้

finish();
startActivity(getIntent());

เพื่อรีเฟรชActivityจากภายใน


2
จะเกิดอะไรขึ้นถ้ามันไม่สามารถเรียกได้ในคลาสของกิจกรรม? วิธีใด ๆ ในการทำมันด้วยการอ้างอิงบริบท?
giorgiline

1
@giorgiline - ใช่สร้างอินเทอร์เฟซที่คุณกำหนดภายในคลาสกิจกรรมและส่งผ่านอินเทอร์เฟซนั้นเป็นพารามิเตอร์ไปยังคลาสภายนอกที่คุณใช้
รวม

1
ว้าวฉันไม่คิดว่ามันจะง่ายขนาดนี้
theblang

1
คุณจะจัดการกับกิจกรรมที่เริ่มต้นเพื่อผลลัพธ์อย่างไร คุณสามารถเริ่มต้นใหม่ด้วยผู้โทรเดิมที่ยังรับผลได้หรือไม่?
tothphu

1
@tothphu - ไม่พยายาม แต่ในทางทฤษฎีฉันคิดว่าใช่ อย่างไรก็ตามครั้งที่สองที่กิจกรรมเสร็จสิ้นกิจกรรมจะไม่ส่งคืนผลลัพธ์ไปยังกิจกรรมที่สร้างขึ้นเป็นครั้งแรก
Sush

65

สำหรับผู้ที่ไม่ต้องการที่จะเห็นว่ากระพริบตาหลังจากสร้างใหม่ ()วิธีการเพียงแค่ใช้

 finish();
 overridePendingTransition(0, 0);
 startActivity(getIntent());
 overridePendingTransition(0, 0);

2
! น่ากลัว ฉันต้องการแทนที่การเปลี่ยนภาพเพื่อไม่ให้ผู้ใช้สังเกตเห็น!
Ceddy Muhoza

เยี่ยมมาก! ผู้ใช้แทบจะไม่เห็นการโหลดซ้ำ
sam

38

นี่คือสิ่งที่ฉันทำเพื่อโหลดกิจกรรมใหม่หลังจากเปลี่ยนกลับจากการเปลี่ยนแปลงค่ากำหนด

@Override
protected void onResume() {

   super.onResume();
   this.onCreate(null);
}

สิ่งนี้จะทำให้กิจกรรมวาดตัวเองเป็นหลัก

อัปเดต: วิธีที่ดีกว่าในการทำเช่นนี้คือการเรียกrecreate()วิธีการ สิ่งนี้จะทำให้กิจกรรมถูกสร้างใหม่


15
อาจใช้งานได้ แต่ไม่แนะนำให้เรียกใช้เมธอดวงจรชีวิตอย่างชัดเจน
ITisha

หากคุณใช้เส้นทางนี้คุณควรใช้เมธอด init () แยกต่างหากซึ่งตั้งค่าทุกอย่างและเรียกมันจากภายใน onCreate () และ onResume () แทนที่จะเรียกใช้ onCreate ()
ทอม

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

1
สิ่งสำคัญคือต้องพิจารณา launchMode ของกิจกรรมเมื่อใช้สร้างใหม่ () ตัวอย่างเช่นเมื่อฉันเรียก recreate () ในกิจกรรมที่มี launchMode = singleTop ฉันไม่เห็น onCreate () ที่ถูกเรียกหลังจากนั้น OTOH ถ้าแทนที่จะเรียก recreate () ฉันจะเรียก finish () อย่างชัดเจนและตามด้วย startActivity () ฉันเห็น onCreate () ถูกเรียกหลังจากนั้น
อัลเบิร์ตคเบราน์

14

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

แทนที่จะเขียนสิ่งนี้

// รีเฟรชกิจกรรมหลักเมื่อปิดกล่องโต้ตอบ

Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish();

สามารถทำได้โดยการเขียนแค่นี้เท่านั้น

recreate();

recreate()เป็นวิธีแก้ปัญหาสำหรับฉัน - "เริ่มต้นใหม่" กิจกรรมไม่ทำงานสำหรับฉันเนื่องจากฉันเริ่มต้นกิจกรรมโดยใช้ "StartActivityForResult" และทำให้พฤติกรรมขัดข้อง
KYL3R


10

ฉันต้องการอัปเดตรายการข้อความในแอปพลิเคชันของฉันอย่างเร่งรีบดังนั้นฉันจึงทำการรีเฟรชกิจกรรม UI หลักของฉันก่อนที่จะปิดกล่องโต้ตอบที่ฉันเข้าฉันแน่ใจว่ามีวิธีที่ดีกว่าในการทำสิ่งนี้ให้สำเร็จ

// Refresh main activity upon close of dialog box
Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish(); //

9

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

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


2
+1 สำหรับการพูดถึง onMowory ฉันไม่ทราบว่าวิธีการดังกล่าวมีอยู่!
hpique

4

เริ่มต้นด้วยความตั้งใจเดียวกันและใกล้ชิดactivityactivity

Intent refresh = new Intent(this, Main.class);
startActivity(refresh);//Start the same Activity
finish(); //finish Activity.

4

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

    Intent i = new Intent(myCurrentActivityName.this,activityIWishToRun.class);    
    startActivityForResult(i, GlobalDataStore.STATIC_INTEGER_VALUE);

สิ่งที่เกิดขึ้นคือเมื่อใดก็ตามที่คุณเสร็จสิ้น () จาก activityIWishToRun คุณกลับสู่กิจกรรมการใช้ชีวิตของคุณ


1
นี่อาจจะเก่า แต่คุณเพิ่งช่วยฉันได้มาก! :)
Lior Iluz

4

การรีโหลดกิจกรรมทั้งหมดของคุณอาจเป็นงานหนัก เพียงแค่ใส่ส่วนของรหัสที่ต้องรีเฟรช ( kotlin ):

override fun onResume() {
    super.onResume()
    //here...
}

Java:

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

}

และเรียก " onResume () " เมื่อต้องการ


2

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


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

"สถานะแอปพลิเคชัน" ในกรณีของคุณคืออะไร การตั้งค่า?
zehrer

2

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


ในทางตรงกันข้ามฉันพยายาม "รีเฟรช" หน้าจอของฉันโดยเริ่มกิจกรรมใหม่ ไม่ปรากฏว่ามีอะไรผิดปกติข้อมูลของฉันได้รับการปรับปรุงตามที่ฉันต้องการ LogCat บอกเล่าเรื่องราวที่แตกต่าง ใน LogCat ฉันกลับไปที่วิธี onCreate ของกิจกรรมมันพยายามดึงการตั้งค่า ความพยายามครั้งแรกที่ฉันได้รับข้อยกเว้นตัวชี้โมฆะจากนั้นจะพยายามอีกครั้งเพื่อเริ่มต้นใน onCreate และได้รับการเก็บไว้ pref ครั้งที่ 2 ผ่าน ไม่แน่ใจว่าเกิดอะไรขึ้นที่นี่ แต่ฉันแค่อยากให้แน่ใจว่าคุณไม่ได้ดูผลลัพธ์เพียงเพราะ WYSIWIG ไม่ใช่กรณีของฉัน
taraloca

คุณเริ่มกิจกรรมใหม่อย่างแน่นอน
hpique

2

ฉันมีปัญหาเดียวกัน

import android.support.v4.content.IntentCompat;

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

รหัสนี้ใช้ได้กับฉัน Android API 17


2

ในกิจกรรมคุณสามารถโทรrecreate()ไปที่ "สร้าง" กิจกรรม (API 11+)


1

ฉันมีวิธีการอื่นเช่น: การตั้งค่าlaunchModeกิจกรรมของฉันเป็นsingleTopและไม่ต้องโทรfinish()ก็startActivity(getIntent())จะทำงาน เพียงแค่มีการดูแลเกี่ยวกับข้อมูลใหม่ทั้งในและonCreate() onNewIntentด้วยวิธีของ Sush แอปพลิเคชันอาจกระพริบเหมือน AMAN SINGH กล่าว แต่แนวทางของ AMAN SINGH จะยังคงสร้างกิจกรรมใหม่ที่ไม่จำเป็นไม่จำเป็นแม้ว่าเขาจะแก้ไขปัญหา 'กะพริบ' ก็ตาม

สายเกินไปสำหรับคำถามนี้ แต่ถ้าใครบางคนกำลังมองหาวิธีการแก้ปัญหานี่คือ


0

หลังจากเข้าสู่ระบบฉันมีปัญหาเดียวกันดังนั้นฉันจึงใช้

@Override
protected void onRestart() {
    this.recreate();
    super.onRestart();
}


0

สำหรับฉันมันใช้งานได้แล้วมันไม่ได้สร้าง Intent ใหม่และเช่นเดียวกันกับ Intents ที่โหลดข้อมูลใหม่

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