Application
ชั้นขยายสามารถประกาศตัวแปรทั่วโลก มีเหตุผลอื่นอีกไหม?
Application
ชั้นขยายสามารถประกาศตัวแปรทั่วโลก มีเหตุผลอื่นอีกไหม?
คำตอบ:
โดยส่วนตัวแล้วฉันไม่สามารถนึกถึงสถานการณ์จริงที่การขยายแอปพลิเคชันอาจเป็นที่นิยมในแนวทางอื่นหรือจำเป็นต้องทำบางสิ่งบางอย่างให้สำเร็จ หากคุณมีวัตถุที่มีราคาแพงและใช้บ่อยคุณสามารถเริ่มต้นได้ใน IntentService เมื่อคุณตรวจพบว่าวัตถุนั้นไม่มีอยู่ในปัจจุบัน แอ็พพลิเคชันเองรันบนเธรด UI ในขณะที่ IntentService รันบนเธรดของตนเอง
ฉันต้องการส่งผ่านข้อมูลจากกิจกรรมไปยังกิจกรรมด้วยเจตนาที่ชัดเจนหรือใช้ SharedPreferences นอกจากนี้ยังมีวิธีการส่งผ่านข้อมูลจากแฟรกเมนต์ไปยังกิจกรรมหลักโดยใช้อินเตอร์เฟส
"prefer to pass data from Activity to Activity with explicit Intents, or use SharedPreferences"
สำหรับ เราควรกำจัดสถานะโลกให้มากที่สุดเท่าที่เราสามารถทำได้และใช้เครื่องมือ Android มาตรฐานสำหรับการจัดการสถานะทั่วโลกแทนที่จะเป็น vars / singletons และอื่น ๆ
apk
ไฟล์ในมือถือของเรามันจะประกอบด้วยบล็อกที่มีประโยชน์หลายบล็อกเช่นActivity
s, Service
s และอื่น ๆApplication
โดยไม่คำนึงถึงActivity
ผู้ใช้ที่ใช้Application
,Cursor
และปิดอีกครั้งและอีกครั้งไม่ดีต่อประสิทธิภาพIntent
s เพื่อส่งผ่านข้อมูลได้ แต่มันเงอะงะและตัวกิจกรรมอาจไม่มีอยู่ในบางสถานการณ์ขึ้นอยู่กับความพร้อมใช้งานของหน่วยความจำApplication
,Application
ในการเริ่มต้นสิ่งบางอย่างเช่นการวิเคราะห์อื่น ๆ ตั้งแต่ระดับแอพลิเคชันที่มีการเริ่มต้นก่อนActivity
หรือ
Services
s กำลังวิ่งคลาสแอปพลิเคชันเป็นวัตถุที่มีรอบการใช้งานทั้งหมดของแอปพลิเคชันของคุณ มันเป็นเลเยอร์สูงสุดของคุณเป็นแอปพลิเคชัน ตัวอย่างประเพณีที่เป็นไปได้:
คุณสามารถเพิ่มสิ่งที่คุณต้องการเมื่อแอปพลิเคชันเริ่มต้นด้วยการแทนที่ onCreate ในคลาสแอปพลิเคชัน
เก็บตัวแปรส่วนกลางที่ข้ามจากกิจกรรมไปยังกิจกรรม เช่นเดียวกับ Asynctask
ฯลฯ
บางครั้งคุณต้องการจัดเก็บข้อมูลเช่นตัวแปรทั่วโลกซึ่งจำเป็นต้องเข้าถึงจากหลายกิจกรรม - บางครั้งทุกที่ภายในแอปพลิเคชัน ในกรณีนี้แอปพลิเคชันวัตถุจะช่วยคุณ
ตัวอย่างเช่นถ้าคุณต้องการรับข้อมูลการตรวจสอบเบื้องต้นสำหรับคำขอhttpแต่ละรายการคุณสามารถใช้วิธีการตรวจสอบข้อมูลในวัตถุแอปพลิเคชัน
หลังจากนี้คุณจะได้รับชื่อผู้ใช้และรหัสผ่านในกิจกรรมใด ๆ เช่นนี้:
MyApplication mApplication = (MyApplication)getApplicationContext();
String username = mApplication.getUsername();
String password = mApplication.getPassword();
และสุดท้ายอย่าลืมใช้ Application object เป็นวัตถุ singleton:
public class MyApplication extends Application {
private static MyApplication singleton;
public MyApplication getInstance(){
return singleton;
}
@Override
public void onCreate() {
super.onCreate();
singleton = this;
}
}
สำหรับข้อมูลเพิ่มเติมกรุณาคลิกApplication Class
คลาสแอปพลิเคชันเป็นซิงเกิลตันที่คุณสามารถเข้าถึงได้จากกิจกรรมใด ๆ หรือที่อื่น ๆ ที่คุณมีวัตถุบริบท
คุณยังได้รับวงจรชีวิตเล็กน้อย
คุณสามารถใช้วิธี onCreate ของแอปพลิเคชันเพื่อยกตัวอย่างวัตถุที่มีราคาแพง แต่ใช้บ่อยเช่นตัวช่วยการวิเคราะห์ จากนั้นคุณสามารถเข้าถึงและใช้วัตถุเหล่านั้นได้ทุกที่
การใช้งานแอพพลิเคชั่นที่ดีที่สุด ตัวอย่าง: สมมติว่าคุณต้องรีสตาร์ทตัวจัดการสัญญาณเตือนเมื่อบูตเสร็จสมบูรณ์
public class BaseJuiceApplication extends Application implements BootListener {
public static BaseJuiceApplication instance = null;
public static Context getInstance() {
if (null == instance) {
instance = new BaseJuiceApplication();
}
return instance;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onBootCompleted(Context context, Intent intent) {
new PushService().scheduleService(getInstance());
//startToNotify(context);
}
ไม่ใช่คำตอบ แต่เป็นข้อสังเกต : โปรดจำไว้ว่าข้อมูลในวัตถุแอปพลิเคชันที่ขยายเพิ่มไม่ควรเชื่อมโยงกับอินสแตนซ์ของกิจกรรมเนื่องจากเป็นไปได้ว่าคุณมีอินสแตนซ์สองกิจกรรมของกิจกรรมเดียวกันที่ทำงานในเวลาเดียวกัน เบื้องหน้าและเป็นหนึ่งในการที่จะไม่สามารถมองเห็นได้)
ตัวอย่างเช่นคุณเริ่มกิจกรรมตามปกติผ่านตัวเรียกใช้จากนั้นจึง "ย่อ" ให้เล็กที่สุด จากนั้นคุณเริ่มต้นแอปอื่น (เช่น Tasker) ซึ่งเริ่มต้นอินสแตนซ์อื่นของ activitiy ของคุณเช่นเพื่อสร้างทางลัดเนื่องจากแอปของคุณรองรับ android.intent.action.CREATE_SHORTCUT หากมีการสร้างทางลัดและการเรียกใช้การสร้างทางลัดของกิจกรรมนี้แก้ไขข้อมูลวัตถุแอปพลิเคชันกิจกรรมที่ทำงานในพื้นหลังจะเริ่มใช้วัตถุแอปพลิเคชันที่ปรับเปลี่ยนนี้เมื่อถูกนำกลับมาที่เบื้องหน้า
ฉันเห็นว่าคำถามนี้ไม่มีคำตอบ ฉันขยายApplication
เพราะฉันใช้การดำเนินการBill Pugh Singleton ( ดูการอ้างอิง ) และบางส่วนของ singletons ต้องการบริบท Application
ชั้นลักษณะเช่นนี้
public class MyApplication extends Application {
private static final String TAG = MyApplication.class.getSimpleName();
private static MyApplication sInstance;
@Contract(pure = true)
@Nullable
public static Context getAppContext() {
return sInstance;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate() called");
sInstance = this;
}
}
และเดี่ยวมีลักษณะเช่นนี้:
public class DataManager {
private static final String TAG = DataManager.class.getSimpleName();
@Contract(pure = true)
public static DataManager getInstance() {
return InstanceHolder.INSTANCE;
}
private DataManager() {
doStuffRequiringContext(MyApplication.getAppContext());
}
private static final class InstanceHolder {
@SuppressLint("StaticFieldLeak")
private static final DataManager INSTANCE = new DataManager();
}
}
วิธีนี้ฉันไม่จำเป็นต้องมีบริบททุกครั้งที่ฉันใช้ซิงเกิลตันและเริ่มต้นการซิงโครไนซ์แบบขี้เกียจกับโค้ดจำนวนน้อยที่สุด
เคล็ดลับ: การอัปเดตเทมเพลตซิงเกิลของ Android Studio ช่วยประหยัดเวลาได้มาก
ฉันคิดว่าคุณสามารถใช้คลาสแอพพลิเคชั่นได้หลายสิ่ง แต่ทั้งหมดนี้เชื่อมโยงกับความต้องการของคุณในการทำบางสิ่งก่อนกิจกรรมหรือบริการใด ๆ ของคุณจะเริ่มขึ้น ตัวอย่างเช่นในแอปพลิเคชันของฉันฉันใช้แบบอักษรที่กำหนดเอง แทนการโทร
Typeface.createFromAsset()
จากทุกกิจกรรมเพื่อรับการอ้างอิงแบบอักษรของฉันจากโฟลเดอร์สินทรัพย์ (นี่ไม่ดีเพราะมันจะส่งผลให้หน่วยความจำรั่วขณะที่คุณทำการอ้างอิงถึงสินทรัพย์ทุกครั้งที่คุณเรียกวิธีการนั้น) ฉันทำสิ่งนี้จากonCreate()
วิธีในชั้นเรียนของฉัน :
private App appInstance;
Typeface quickSandRegular;
...
public void onCreate() {
super.onCreate();
appInstance = this;
quicksandRegular = Typeface.createFromAsset(getApplicationContext().getAssets(),
"fonts/Quicksand-Regular.otf");
...
}
ตอนนี้ฉันมีวิธีที่กำหนดเช่นนี้:
public static App getAppInstance() {
return appInstance;
}
และนี่:
public Typeface getQuickSandRegular() {
return quicksandRegular;
}
ดังนั้นจากที่ใดก็ได้ในแอปพลิเคชันของฉันสิ่งที่ฉันต้องทำคือ:
App.getAppInstance().getQuickSandRegular()
การใช้งานอื่นสำหรับคลาสแอปพลิเคชันสำหรับฉันคือการตรวจสอบว่าอุปกรณ์เชื่อมต่อกับอินเทอร์เน็ตก่อนกิจกรรมและบริการที่ต้องใช้การเชื่อมต่อจริง ๆ เริ่มต้นและดำเนินการที่จำเป็น
ที่มา: https://github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class
ในหลาย ๆ แอปไม่จำเป็นต้องทำงานกับคลาสแอปพลิเคชันโดยตรง อย่างไรก็ตามมีการใช้คลาสแอปพลิเคชันแบบกำหนดเองที่ยอมรับได้ไม่กี่:
- งานพิเศษที่ต้องดำเนินการก่อนสร้างกิจกรรมแรกของคุณ
- การกำหนดค่าเริ่มต้นทั่วโลกที่ต้องใช้ร่วมกันในทุกองค์ประกอบ (การรายงานข้อขัดข้องการคงอยู่)
- วิธีการแบบคงที่เพื่อให้ง่ายต่อการเข้าถึงข้อมูลที่ไม่เปลี่ยนรูปแบบคงที่เช่นวัตถุไคลเอนต์เครือข่ายที่ใช้ร่วมกัน
คุณไม่ควรจัดเก็บข้อมูลอินสแตนซ์ที่ไม่แน่นอนภายในวัตถุแอปพลิเคชันเพราะถ้าคุณคิดว่าข้อมูลของคุณจะอยู่ที่นั่นแอปพลิเคชันของคุณจะหยุดทำงานอย่างผิดพลาดในบางจุดด้วย NullPointerException แอปพลิเคชันวัตถุไม่รับประกันว่าจะอยู่ในหน่วยความจำตลอดไปมันจะถูกฆ่า ตรงกันข้ามกับความเชื่อที่ได้รับความนิยมแอปจะไม่ถูกรีสตาร์ทตั้งแต่เริ่มต้น Android จะสร้างแอปพลิเคชันวัตถุใหม่และเริ่มกิจกรรมที่ผู้ใช้เคยทำมาก่อนเพื่อให้เห็นภาพลวงตาว่าแอปพลิเคชันไม่เคยถูกฆ่าตายตั้งแต่แรก
คุณสามารถเข้าถึงตัวแปรไปยังคลาสใด ๆ ได้โดยไม่ต้องสร้างออบเจ็กต์หากถูกขยายโดย Application พวกเขาสามารถเรียกได้ทั่วโลกและรัฐของพวกเขาจะยังคงอยู่จนกว่าแอปพลิเคชันจะไม่ถูกฆ่า
การใช้แอปพลิเคชันที่ขยายเพิ่มเพียงทำให้แอปพลิเคชันของคุณแน่ใจสำหรับการดำเนินการใด ๆ ที่คุณต้องการตลอดระยะเวลาการทำงานของแอปพลิเคชัน ตอนนี้อาจเป็นตัวแปรชนิดใดก็ได้และสมมติว่าคุณต้องการดึงข้อมูลบางอย่างจากเซิร์ฟเวอร์จากนั้นคุณสามารถใส่ asynctask ในแอปพลิเคชันเพื่อที่จะดึงข้อมูลแต่ละครั้งและต่อเนื่องเพื่อให้คุณได้รับข้อมูลที่อัปเดตโดยอัตโนมัติ .. ใช้ลิงค์นี้ สำหรับความรู้เพิ่มเติม ....
http://www.intridea.com/blog/2011/5/24/how-to-use-application-object-of-android
เพื่อเพิ่มคำตอบอื่น ๆ ที่ระบุว่าคุณอาจต้องการเก็บตัวแปรในขอบเขตแอปพลิเคชันสำหรับเธรดที่รันเป็นเวลานานหรือวัตถุอื่น ๆ ที่จำเป็นต้องเชื่อมโยงกับแอปพลิเคชันของคุณที่คุณไม่ได้ใช้กิจกรรม (แอปพลิเคชันไม่ใช่กิจกรรม) เช่นไม่สามารถร้องขอบริการที่ถูกเชื่อมโยง .. ดังนั้นจึงควรใช้การเชื่อมโยงกับอินสแตนซ์ของแอปพลิเคชัน คำเตือนที่ชัดเจนเพียงวิธีนี้คือวัตถุมีชีวิตได้ตราบใดที่แอปพลิเคชั่นยังมีชีวิตอยู่ดังนั้นจึงจำเป็นต้องมีการควบคุมโดยนัยเกี่ยวกับหน่วยความจำมากขึ้นมิฉะนั้นคุณจะพบปัญหาเกี่ยวกับหน่วยความจำเช่นรั่ว
สิ่งอื่นที่คุณอาจพบว่ามีประโยชน์คือในลำดับของการดำเนินการแอปพลิเคชันจะเริ่มก่อนกิจกรรมใด ๆ ในช่วงเวลานี้คุณสามารถเตรียมการดูแลทำความสะอาดที่จำเป็นที่จะเกิดขึ้นก่อนที่กิจกรรมแรกของคุณหากคุณต้องการ
2018-10-19 11:31:55.246 8643-8643/: application created
2018-10-19 11:31:55.630 8643-8643/: activity created