เหตุใดจึงต้องขยายคลาสแอปพลิเคชัน Android


168

Applicationชั้นขยายสามารถประกาศตัวแปรทั่วโลก มีเหตุผลอื่นอีกไหม?


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

คำตอบ:


29

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

ฉันต้องการส่งผ่านข้อมูลจากกิจกรรมไปยังกิจกรรมด้วยเจตนาที่ชัดเจนหรือใช้ SharedPreferences นอกจากนี้ยังมีวิธีการส่งผ่านข้อมูลจากแฟรกเมนต์ไปยังกิจกรรมหลักโดยใช้อินเตอร์เฟส


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

3
คุณจะทำอย่างไร
serj

8
+1 "prefer to pass data from Activity to Activity with explicit Intents, or use SharedPreferences"สำหรับ เราควรกำจัดสถานะโลกให้มากที่สุดเท่าที่เราสามารถทำได้และใช้เครื่องมือ Android มาตรฐานสำหรับการจัดการสถานะทั่วโลกแทนที่จะเป็น vars / singletons และอื่น ๆ
Oleksandr Karaberov

9
ทำไม? เตรียมความพร้อมสำหรับ Android ในบางจุดที่รันพวกเขาในกระบวนการที่แตกต่างกันหรือส่วนประกอบใด ๆ และทุกอย่างสามารถนำมาใช้ซ้ำได้โดยแอปใด ๆ ในขณะที่มันถูก จำกัด โดยเจตนา? เพียงแค่ส่งข้อมูลวัตถุแทนการทำให้เป็นอันดับพวกเขาจะบันทึกซีพียูและหน่วยความจำ การจัดทำสิ่งสำหรับการส่งมอบภายในกระบวนการบนอุปกรณ์เดียวกันนั้นไม่เหมาะอย่างใด ฉันไม่เห็นจุดที่ intentservice ใช้เช่นนั้น (เพิ่งทำเธรดอื่นด้วยใหม่) จริงๆสิ่งต่าง ๆ มากมายที่สร้างความสับสนให้กับตัวแปลงสัญญาณมาจากสิ่งที่ Google เพิ่ม "ผู้ช่วยเหลือ" ทำราวกับว่ากิจกรรมต่าง ๆ วิ่งบนคอมพิวเตอร์แยกกัน
Lassi Kinnunen

127

บทนำ:

ป้อนคำอธิบายรูปภาพที่นี่

  1. หากเราพิจารณาapkไฟล์ในมือถือของเรามันจะประกอบด้วยบล็อกที่มีประโยชน์หลายบล็อกเช่นActivitys, Services และอื่น ๆ
  2. องค์ประกอบเหล่านี้ไม่ได้สื่อสารกันอย่างสม่ำเสมอและอย่าลืมว่าพวกเขามีวงจรชีวิตของตัวเอง ซึ่งระบุว่าพวกเขาอาจใช้งานได้ในครั้งเดียวและไม่ได้ใช้งานในช่วงเวลาอื่น

ที่ต้องการ:

  1. บางครั้งเราอาจต้องการสถานการณ์ที่เราจำเป็นต้องเข้าถึงตัวแปรและสถานะของมันทั้งหมดApplicationโดยไม่คำนึงถึงActivityผู้ใช้ที่ใช้
  2. ตัวอย่างคือการที่ผู้ใช้อาจต้องเข้าถึงตัวแปรที่เก็บข้อมูลส่วนบุคคล (เช่นชื่อ) ของเขาว่าจะต้องมีการเข้าถึงทั่ว Application,
  3. เราสามารถใช้ SQLite แต่การสร้างCursorและปิดอีกครั้งและอีกครั้งไม่ดีต่อประสิทธิภาพ
  4. เราสามารถใช้Intents เพื่อส่งผ่านข้อมูลได้ แต่มันเงอะงะและตัวกิจกรรมอาจไม่มีอยู่ในบางสถานการณ์ขึ้นอยู่กับความพร้อมใช้งานของหน่วยความจำ

การใช้งาน Application Class:

  1. การเข้าถึงตัวแปรข้ามApplication,
  2. คุณสามารถใช้Applicationในการเริ่มต้นสิ่งบางอย่างเช่นการวิเคราะห์อื่น ๆ ตั้งแต่ระดับแอพลิเคชันที่มีการเริ่มต้นก่อนActivityหรือ Servicess กำลังวิ่ง
  3. มีวิธีการ overridden ที่เรียกว่า onConfigurationChanged () ที่จะถูกเรียกเมื่อมีการเปลี่ยนแปลงการกำหนดค่าแอปพลิเคชัน (แนวนอนเป็นแนวตั้งและในทางกลับกัน)
  4. นอกจากนี้ยังมีเหตุการณ์ที่เรียกว่า onLowMemory () ที่เปิดใช้งานเมื่ออุปกรณ์ Android มีหน่วยความจำเหลือน้อย

ในส่วนความต้องการของคุณทำไมไม่ใช้ SharedPreferences

ในตัวอย่างที่ 1 เช่นการบันทึกข่าวสารส่วนตัว SharedPreferences สามารถใช้ได้ แต่ตัวอย่างที่คุณให้ไว้ในส่วนสุดท้ายเคลียร์ข้อสงสัยของฉัน ขอบคุณ!
Saurabh Singh

63

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

  • คุณสามารถเพิ่มสิ่งที่คุณต้องการเมื่อแอปพลิเคชันเริ่มต้นด้วยการแทนที่ onCreate ในคลาสแอปพลิเคชัน

  • เก็บตัวแปรส่วนกลางที่ข้ามจากกิจกรรมไปยังกิจกรรม เช่นเดียวกับ Asynctask

    ฯลฯ


4
การใช้แอปพลิเคชันเป็นพื้นการทุ่มตลาดสำหรับตัวแปรทั่วโลกของแอปพลิเคชันนั้นเป็นกลิ่นรหัสใหญ่ คุณควรใช้คลาสที่กำหนดเองและเฉพาะเจาะจงมากขึ้นเป็นซิงเกิลตันหรือกับตัวแปรแบบสแตติกเพื่อทำสิ่งนี้ให้สำเร็จ
ออสติน

5
@ustin ทำไมมันเป็นกลิ่นหรือไม่
Relm

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

31

บางครั้งคุณต้องการจัดเก็บข้อมูลเช่นตัวแปรทั่วโลกซึ่งจำเป็นต้องเข้าถึงจากหลายกิจกรรม - บางครั้งทุกที่ภายในแอปพลิเคชัน ในกรณีนี้แอปพลิเคชันวัตถุจะช่วยคุณ

ตัวอย่างเช่นถ้าคุณต้องการรับข้อมูลการตรวจสอบเบื้องต้นสำหรับคำขอ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


2
กรุณาอธิบายให้ฉันฟังหน่อยทำไมเราต้องสร้างวัตถุเดี่ยวของคลาสแอพพลิเคชั่นอย่างชัดเจนเท่าที่ฉันรู้ว่ามันเป็นซิงเกิล เราสามารถสร้างแอปพลิเคชั่นหลายวัตถุได้ถ้าทำได้แล้วได้อย่างไร และผลที่ตามมาคืออะไร? กรุณาอธิบาย
Syed Raza Mehdi

ไม่อาจเป็นคลาสแอปพลิเคชันเดียวเท่านั้น developer.android.com/guide/topics/manifest/…
IntelliJ Amiya

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

1
ขอบคุณฉันพบคำตอบของฉันที่นี่ในลิงค์นี้developer.android.com/reference/android/app/Application.html
Syed Raza Mehdi

อยู่ที่ไหน * * * * * * * * เดี่ยววัตถุในการที่
ดร. Andro

8

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

คุณยังได้รับวงจรชีวิตเล็กน้อย

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


6
"คุณยังได้รับวงจรชีวิตเล็กน้อย" คุณอาจต้องการอ้างสิทธิ์อีกครั้ง
wtsang02

2
ฉันหมายความว่าคุณจะได้รับโทรศัพท์ตลอดวงจรชีวิต แต่ไม่มากเท่ากับกิจกรรมหรือชิ้นส่วน ตัวอย่างเช่นไม่มี onDestroy () สำหรับคลาส Application
Jon F Hancock

คลาสนี้ถูกสร้างขึ้นโดยอัตโนมัติหรือไม่?
Konstantin Konopko

ใช่. ตราบใดที่คุณระบุอย่างถูกต้องในตัวคุณ AndroidManifest.xml
Jon F Hancock

ไม่มันไม่ได้ถูกสร้างขึ้นโดยอัตโนมัติคุณต้องสร้างมันขึ้นมาแล้วประกาศมันในไฟล์ Manifest ของคุณ
Ojonugwa Jude Ochalifu

7

การใช้งานแอพพลิเคชั่นที่ดีที่สุด ตัวอย่าง: สมมติว่าคุณต้องรีสตาร์ทตัวจัดการสัญญาณเตือนเมื่อบูตเสร็จสมบูรณ์

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);
    }

ฉันสงสัยว่าทำไมเราต้องทำการอ้างอิงแบบคงที่ของวัตถุแอปพลิเคชันซึ่งเราสามารถรับมันได้โดยใช้ getApplication () และพิมพ์ไปยังคลาสแอปพลิเคชัน เท่าที่ฉันเข้าใจแนวคิดนี้ว่าแอพพลิเคชั่นคลาสนั้นสร้างขึ้นโดยระบบปฏิบัติการของตัวเองและควรมีเพียงอินสแตนซ์เดียวที่ดูแลโดยระบบปฏิบัติการ กรุณาอธิบายขอบคุณ
Syed Raza Mehdi

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

5

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

ตัวอย่างเช่นคุณเริ่มกิจกรรมตามปกติผ่านตัวเรียกใช้จากนั้นจึง "ย่อ" ให้เล็กที่สุด จากนั้นคุณเริ่มต้นแอปอื่น (เช่น Tasker) ซึ่งเริ่มต้นอินสแตนซ์อื่นของ activitiy ของคุณเช่นเพื่อสร้างทางลัดเนื่องจากแอปของคุณรองรับ android.intent.action.CREATE_SHORTCUT หากมีการสร้างทางลัดและการเรียกใช้การสร้างทางลัดของกิจกรรมนี้แก้ไขข้อมูลวัตถุแอปพลิเคชันกิจกรรมที่ทำงานในพื้นหลังจะเริ่มใช้วัตถุแอปพลิเคชันที่ปรับเปลี่ยนนี้เมื่อถูกนำกลับมาที่เบื้องหน้า


4

ฉันเห็นว่าคำถามนี้ไม่มีคำตอบ ฉันขยาย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 ช่วยประหยัดเวลาได้มาก


3

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

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()

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


1
พูดได้ดี. เยี่ยมมาก ๆ
Oluwatobi Adenekan

3

ที่มา: https://github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class

ในหลาย ๆ แอปไม่จำเป็นต้องทำงานกับคลาสแอปพลิเคชันโดยตรง อย่างไรก็ตามมีการใช้คลาสแอปพลิเคชันแบบกำหนดเองที่ยอมรับได้ไม่กี่:

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

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


1

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


1

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

http://www.intridea.com/blog/2011/5/24/how-to-use-application-object-of-android


ไม่ใช่เธรดดังนั้น "สำหรับการดำเนินการใด ๆ ที่คุณต้องการตลอดระยะเวลาการทำงานของแอปพลิเคชันของคุณ" มันไม่จริง.
Lassi Kinnunen

1

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

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

2018-10-19 11:31:55.246 8643-8643/: application created
2018-10-19 11:31:55.630 8643-8643/: activity created
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.