Mengapa memperpanjang kelas Aplikasi Android?


168

ApplicationKelas yang diperluas dapat mendeklarasikan variabel global. Apakah ada alasan lain?


Ini hanya ide dari atas kepala saya, tetapi Anda harus dapat mengesampingkan onCreate dan menunjukkan satu kali layar mulai daripada MainActivity, yaitu layar intro saat pertama kali pengguna membuka aplikasi.
btse

Jawaban:


29

Begitu saja, saya tidak bisa memikirkan skenario nyata di mana memperluas Aplikasi lebih baik daripada pendekatan lain atau diperlukan untuk mencapai sesuatu. Jika Anda memiliki objek yang mahal dan sering digunakan, Anda dapat menginisialisasi dalam IntentService ketika Anda mendeteksi bahwa objek tersebut tidak ada saat ini. Aplikasi itu sendiri berjalan pada utas UI, sementara IntentService berjalan pada utasnya sendiri.

Saya lebih suka meneruskan data dari Aktivitas ke Aktivitas dengan Maksud eksplisit, atau menggunakan SharedPreferences. Ada juga cara untuk meneruskan data dari Fragmen ke Aktivitas induknya menggunakan antarmuka.


39
Ada banyak kegunaan perluasan kelas aplikasi. Salah satu yang sangat berguna adalah menangkap semua pengecualian yang tidak tertangkap dalam aplikasi Anda. JADI ini adalah sesuatu yang bisa sangat berguna
png

3
Bagaimana kamu melakukannya ?
serj

8
+1 untuk "prefer to pass data from Activity to Activity with explicit Intents, or use SharedPreferences". Kita harus selalu menghilangkan negara global sebanyak yang kita bisa dan menggunakan alat Android standar untuk manajemen negara global, bukan vars statis / lajang dan lain
Oleksandr Karaberov

9
Mengapa? untuk mempersiapkan Android di beberapa titik menjalankannya dalam proses yang berbeda atau apa pun dan setiap komponen dapat digunakan kembali oleh aplikasi apa pun, sementara itu sengaja dibatasi? hanya melewatkan objek data alih-alih membuat urutannya menghemat cpu dan memori. membagi-bagikan barang-barang untuk serah terima perangkat dalam-proses-pada-perangkat yang sama tidaklah ideal. Saya benar-benar tidak melihat titik penggunaan intentservice seperti itu (lakukan saja utas lainnya dengan yang baru). benar-benar banyak hal yang membingungkan coders berasal dari yang hampir semua google menambahkan "pembantu" dibuat seolah-olah kegiatan berjalan di komputer yang terpisah.
Lassi Kinnunen

127

Pengantar:

masukkan deskripsi gambar di sini

  1. Jika kami mempertimbangkan apkfile di ponsel kami, file itu terdiri dari beberapa blok berguna seperti, Activitys, Services , dan lainnya.
  2. Komponen-komponen ini tidak berkomunikasi satu sama lain secara teratur dan tidak lupa mereka memiliki siklus hidup mereka sendiri. yang mengindikasikan bahwa mereka mungkin aktif pada satu waktu dan tidak aktif pada saat lain.

Persyaratan:

  1. Kadang-kadang kita mungkin memerlukan skenario di mana kita perlu mengakses variabel dan statusnya di seluruh Applicationterlepas dari Activitypengguna yang menggunakan,
  2. Contohnya adalah bahwa pengguna mungkin perlu mengakses variabel yang menyimpan informasi personelnya (misalnya nama) yang harus diakses di seluruh Application,
  3. Kita dapat menggunakan SQLite tetapi membuat Cursordan menutupnya lagi dan lagi tidak baik pada kinerja,
  4. Kita bisa menggunakan Intents untuk meneruskan data tetapi itu canggung dan aktivitas itu sendiri mungkin tidak ada pada skenario tertentu tergantung pada ketersediaan memori.

Penggunaan Kelas Aplikasi:

  1. Akses ke variabel di seluruh Application,
  2. Anda dapat menggunakan Applicationuntuk memulai hal-hal tertentu seperti analisis dll sejak kelas aplikasi dimulai sebelum Activitys atau Servicess sedang berjalan,
  3. Ada metode override yang disebut onConfigurationChanged () yang dipicu ketika konfigurasi aplikasi diubah (horizontal ke vertikal & sebaliknya),
  4. Ada juga acara bernama onLowMemory () yang dipicu ketika perangkat Android kehabisan memori.

Di bagian Persyaratan Anda, mengapa tidak menggunakan SharedPreferences?

Pada contoh pertama seperti untuk menyimpan informasi pribadi, SharedPreferences dapat digunakan. Tetapi contoh-contoh yang Anda berikan di bagian terakhir menghapus keraguan saya. Terima kasih!
Saurabh Singh

63

Kelas aplikasi adalah objek yang memiliki siklus hidup penuh aplikasi Anda. Ini adalah lapisan tertinggi Anda sebagai aplikasi. contoh kemungkinan penggunaan:

  • Anda dapat menambahkan apa yang Anda butuhkan saat aplikasi dimulai dengan mengganti onCreate di kelas Aplikasi.

  • menyimpan variabel global yang melompat dari Activity ke Activity. Seperti Asynctask.

    dll


4
Menggunakan Aplikasi sebagai tempat pembuangan untuk variabel aplikasi-global adalah bau kode besar. Anda harus menggunakan kebiasaan Anda sendiri, kelas yang lebih spesifik sebagai lajang atau dengan variabel statis untuk melakukan hal ini.
Austin

5
@ Austin mengapa ini bau?
Relm

1
Ya, mengapa mencium? Seperti yang dinyatakan sebelumnya, kelas Aplikasi berada di puncak hierarki, dan saya dapat bertaruh uang makan siang saya, bahwa kelas singleton kustom ada di bawahnya. Jadi, jika push datang untuk mendorong, dan ponsel Anda kekurangan memori, saya akan mengatakan bahwa custom singleton adalah yang pertama terbunuh, daripada kelas Aplikasi (yang pada dasarnya adalah seluruh aplikasi Anda).
Starwave

31

Terkadang Anda ingin menyimpan data, seperti variabel global yang perlu diakses dari beberapa Aktivitas - terkadang di mana saja dalam aplikasi. Dalam hal ini, objek Aplikasi akan membantu Anda.

Misalnya, jika Anda ingin mendapatkan data otentikasi dasar untuk setiap permintaan http , Anda dapat menerapkan metode untuk data otentikasi di objek aplikasi.

Setelah ini, Anda bisa mendapatkan nama pengguna dan kata sandi di salah satu kegiatan seperti ini:

MyApplication mApplication = (MyApplication)getApplicationContext();
String username = mApplication.getUsername();
String password = mApplication.getPassword();

Dan akhirnya, jangan lupa untuk menggunakan objek Aplikasi sebagai objek tunggal:

 public class MyApplication extends Application {
    private static MyApplication singleton;

    public MyApplication getInstance(){
        return singleton;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        singleton = this;
    }
}

Untuk informasi lebih lanjut, silakan Klik Kelas Aplikasi


2
mohon jelaskan kepada saya ini, mengapa kita perlu secara eksplisit membuat objek singleton dari kelas Aplikasi, sejauh yang saya tahu itu sendiri merupakan singleton. Bisakah kita membuat banyak objek aplikasi, jika bisa, lalu bagaimana? dan apa konsekuensinya? Mohon jelaskan.
Syed Raza Mehdi

Tidak, Mungkin hanya satu kelas aplikasi. developer.android.com/guide/topics/manifest/…
IntelliJ Amiya

lalu mengapa kita perlu secara eksplisit mempertahankan objek tunggal itu? Bukankah OS mempertahankannya untuk kita? Sebenarnya saya menemukan kode di mana ada objek aplikasi yang dibuat di kelas aktivitas dan tidak disebutkan dalam manifes. Saya pikir ini salah, saya juga penasaran mengapa kita membuat objek singleton statis. Apa yang Anda pikirkan adalah pendekatan terbaik. Terima kasih telah membalas.
Syed Raza Mehdi

1
terima kasih saya menemukan jawaban saya di sini di tautan ini developer.android.com/reference/android/app/Application.html
Syed Raza Mehdi

Di mana * singleton * objek dalam hal itu
Dr. aNdRO

8

Kelas Aplikasi adalah singleton yang dapat Anda akses dari aktivitas apa pun atau di mana pun Anda memiliki objek Konteks.

Anda juga mendapatkan sedikit siklus hidup.

Anda bisa menggunakan metode onCreate Aplikasi untuk membuat instance mahal, tetapi objek yang sering digunakan seperti pembantu analitik. Kemudian Anda dapat mengakses dan menggunakan benda-benda itu di mana-mana.


6
"Kamu juga mendapatkan sedikit siklus hidup." Anda mungkin ingin menulis ulang itu.
wtsang02

2
Maksud saya Anda mendapatkan beberapa panggilan siklus hidup, tetapi tidak sebanyak dengan aktivitas atau fragmen. Misalnya, tidak ada onDestroy () untuk kelas Aplikasi.
Jon F Hancock

Apakah kelas ini secara otomatis dibuat?
Konstantin Konopko

Iya. Selama Anda menentukannya dengan benar di AndroidManifest.xml Anda.
Jon F Hancock

Tidak, itu tidak secara otomatis dibuat. Anda harus membuatnya dan kemudian mendeklarasikannya dalam file manifes Anda
Ojonugwa Jude Ochalifu

7

Penggunaan kelas aplikasi terbaik. Contoh: Misalkan Anda perlu me-restart alarm Anda pada saat boot selesai.

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

Saya bertanya-tanya mengapa kita perlu membuat referensi statis objek aplikasi, di mana kita bisa mendapatkannya menggunakan getApplication () dan mengetikkannya ke kelas aplikasi. Sejauh yang saya mengerti konsep ini bahwa kelas aplikasi dibuat oleh OS itu sendiri dan seharusnya hanya memiliki satu instance yang dikelola oleh OS. Mohon jelaskan, terima kasih.
Syed Raza Mehdi

Kamu benar. Memanggil getApplication dari komponen aplikasi apa pun di aplikasi Anda mengembalikan instance turunan tunggal aplikasi yang merupakan aplikasi Anda. Ini ditangani secara internal oleh kerangka kerja Android. Yang perlu Anda lakukan adalah melakukan cast yang mengembalikan instance ke kelas kustom Anda yang memperluas Aplikasi. Anda juga perlu mengatur manifes Anda sesuai sehingga kelas yang tepat digunakan oleh kerangka kerja Android untuk membuat instance.
Matt Welke

5

Bukan jawaban tetapi pengamatan : perlu diingat bahwa data dalam objek aplikasi yang diperluas tidak boleh dikaitkan dengan turunan dari suatu kegiatan, karena ada kemungkinan Anda memiliki dua contoh aktivitas yang sama yang berjalan pada waktu yang sama (satu di latar depan dan yang tidak terlihat) .

Misalnya, Anda memulai aktivitas Anda secara normal melalui peluncur, lalu "meminimalkannya". Anda kemudian memulai aplikasi lain (yaitu Tasker) yang memulai instance lain dari aktivitas Anda, misalnya untuk membuat pintasan, karena aplikasi Anda mendukung android.intent.action.CREATE_SHORTCUT. Jika pintasan kemudian dibuat dan pemanggilan yang membuat pintasan dari aktivitas ini mengubah data objek aplikasi, maka aktivitas yang berjalan di latar belakang akan mulai menggunakan objek aplikasi yang dimodifikasi ini setelah dibawa kembali ke latar depan.


4

Saya melihat bahwa pertanyaan ini tidak ada jawaban. Saya memperluas Applicationkarena saya menggunakan implementasi Bill Pugh Singleton ( lihat referensi ) dan beberapa lajang saya membutuhkan konteks. The Applicationkelas terlihat seperti ini:

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

Dan lajang terlihat seperti ini:

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

Dengan cara ini saya tidak perlu memiliki konteks setiap kali saya menggunakan singleton dan mendapatkan inisialisasi disinkronkan malas dengan jumlah kode minimal.

Kiat: memperbarui templat Android Studio singleton menghemat banyak waktu.


3

Saya pikir Anda dapat menggunakan kelas Aplikasi untuk banyak hal, tetapi mereka semua terikat pada kebutuhan Anda untuk melakukan beberapa hal SEBELUM Kegiatan atau Layanan Anda dimulai. Misalnya, dalam aplikasi saya, saya menggunakan font khusus. Alih-alih menelepon

Typeface.createFromAsset()

dari setiap Kegiatan untuk mendapatkan referensi untuk font saya dari folder Aset (ini buruk karena akan menyebabkan kebocoran memori karena Anda menyimpan referensi ke aset setiap kali Anda memanggil metode itu), saya melakukan ini dari onCreate()metode di kelas Aplikasi saya :

private App appInstance;
Typeface quickSandRegular;
...
public void onCreate() {
    super.onCreate();

    appInstance = this;
    quicksandRegular = Typeface.createFromAsset(getApplicationContext().getAssets(),
                       "fonts/Quicksand-Regular.otf");
   ...
   }

Sekarang, saya juga memiliki metode yang didefinisikan seperti ini:

public static App getAppInstance() {
    return appInstance;
}

dan ini:

public Typeface getQuickSandRegular() {
    return quicksandRegular;
}

Jadi, dari mana saja dalam aplikasi saya, yang harus saya lakukan adalah:

App.getAppInstance().getQuickSandRegular()

Penggunaan lain untuk kelas Aplikasi bagi saya adalah untuk memeriksa apakah perangkat terhubung ke Internet SEBELUM kegiatan dan layanan yang memerlukan koneksi benar-benar mulai dan mengambil tindakan yang diperlukan.


1
Kata baik. Sangat bagus rusak.
Oluwatobi Adenekan

3

Sumber: https://github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class

Di banyak aplikasi, tidak perlu bekerja dengan kelas aplikasi secara langsung. Namun, ada beberapa penggunaan kelas aplikasi khusus yang dapat diterima:

  • Tugas khusus yang perlu dijalankan sebelum pembuatan aktivitas pertama Anda
  • Inisialisasi global yang perlu dibagikan di semua komponen (pelaporan kerusakan, kegigihan)
  • Metode statis untuk akses mudah ke data statis yang tidak dapat diubah seperti objek klien jaringan bersama

Anda seharusnya tidak pernah menyimpan data instance yang dapat berubah di dalam objek Aplikasi karena jika Anda menganggap bahwa data Anda akan tetap ada, aplikasi Anda pasti akan macet di beberapa titik dengan NullPointerException. Objek aplikasi tidak dijamin untuk tetap dalam memori selamanya, itu akan terbunuh. Berlawanan dengan kepercayaan populer, aplikasi tidak akan dimulai kembali dari awal. Android akan membuat objek Aplikasi baru dan memulai aktivitas di mana pengguna sebelumnya memberikan ilusi bahwa aplikasi tidak pernah terbunuh sejak awal.


1

Anda dapat mengakses variabel ke kelas apa pun tanpa membuat objek, jika diperluas oleh Aplikasi. Mereka dapat dipanggil secara global dan negara mereka dipertahankan sampai aplikasi tidak terbunuh.


1

Penggunaan aplikasi perluasan hanya membuat aplikasi Anda yakin untuk segala jenis operasi yang Anda inginkan selama periode berjalan aplikasi Anda. Sekarang mungkin semua jenis variabel dan anggaplah jika Anda ingin mengambil beberapa data dari server maka Anda dapat menempatkan asynctask Anda di aplikasi sehingga akan mengambil setiap waktu dan terus menerus, sehingga Anda akan mendapatkan data yang diperbarui secara otomatis .. Gunakan tautan ini untuk pengetahuan lebih lanjut ....

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


itu bukan utas, jadi "untuk segala jenis operasi yang Anda inginkan selama periode berjalan aplikasi Anda." tidak benar.
Lassi Kinnunen

1

Untuk menambahkan ke jawaban lain yang menyatakan bahwa Anda mungkin ingin menyimpan variabel dalam lingkup aplikasi, untuk utas yang telah berjalan lama atau objek lain yang perlu terikat ke aplikasi Anda di mana Anda TIDAK menggunakan aktivitas (aplikasi bukan aktivitas) .. seperti tidak dapat meminta layanan yang diikat .. maka mengikat ke instance aplikasi lebih disukai. Satu-satunya peringatan yang jelas dengan pendekatan ini adalah bahwa objek hidup selama aplikasi masih hidup, sehingga kontrol yang lebih implisit terhadap memori diperlukan jika Anda akan mengalami masalah yang berkaitan dengan memori seperti kebocoran.

Hal lain yang mungkin bermanfaat bagi Anda adalah bahwa dalam urutan operasi, aplikasi dimulai terlebih dahulu sebelum aktivitas apa pun. Dalam jangka waktu ini, Anda dapat menyiapkan pembersihan yang diperlukan yang akan terjadi sebelum aktivitas pertama Anda jika diinginkan.

2018-10-19 11:31:55.246 8643-8643/: application created
2018-10-19 11:31:55.630 8643-8643/: activity created
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.