Application
Kelas yang diperluas dapat mendeklarasikan variabel global. Apakah ada alasan lain?
Application
Kelas yang diperluas dapat mendeklarasikan variabel global. Apakah ada alasan lain?
Jawaban:
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.
"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
apk
file di ponsel kami, file itu terdiri dari beberapa blok berguna seperti, Activity
s, Service
s , dan lainnya.Application
terlepas dari Activity
pengguna yang menggunakan,Application
,Cursor
dan menutupnya lagi dan lagi tidak baik pada kinerja,Intent
s untuk meneruskan data tetapi itu canggung dan aktivitas itu sendiri mungkin tidak ada pada skenario tertentu tergantung pada ketersediaan memori.Application
,Application
untuk memulai hal-hal tertentu seperti analisis dll sejak kelas aplikasi dimulai sebelum Activity
s atau
Services
s sedang berjalan,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
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
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.
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);
}
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.
Saya melihat bahwa pertanyaan ini tidak ada jawaban. Saya memperluas Application
karena saya menggunakan implementasi Bill Pugh Singleton ( lihat referensi ) dan beberapa lajang saya membutuhkan konteks. The Application
kelas 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.
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.
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.
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.
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
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