Membangun Aplikasi POS Android yang Tidak Bisa Ditutup

Diterbitkan: 2022-03-11

Dunia pengembangan aplikasi seluler sangat luas dan terus berkembang, dengan kerangka kerja dan teknologi baru bermunculan hampir setiap hari. Saat memikirkan perangkat seluler, Anda mungkin memikirkan ponsel atau mungkin tablet Anda, meskipun tidak sepopuler smartphone.

iOS Apple dan Android Google mendominasi pasar seluler, masing-masing mengalami pasang surut selama dekade terakhir. Hari ini, saya akan berbicara lebih banyak tentang Android dan penggunaannya pada perangkat yang tidak harus mobile.

Menjadi open-source memiliki efek samping yang sangat menarik pada sistem operasi seluler Google. Tentu, kita mungkin memikirkan semua garpu Android yang berbeda dari berbagai perusahaan ponsel cerdas, tetapi bagaimana dengan semua perangkat yang menjalankan Android yang bukan perangkat seluler? Mulai dari lemari es, smart oven, kunci pintu, atau bahkan perangkat Point of Sale (POS) bisa menjalankan Android saat ini. Yang terakhir adalah alasan saya akhirnya menulis artikel ini.

Perangkat Point of Sale (POS) dapat menjalankan Android saat ini

Sistem POS Android

Sekitar setahun yang lalu, saya bermain dengan perangkat Android yang sama sekali tidak biasa, dan itu bukan sesuatu yang mungkin digunakan kebanyakan orang. Perangkat yang dimaksud adalah sistem POS berbasis Android dari vendor China yang juga memiliki printer thermal terintegrasi (seperti yang digunakan untuk mencetak struk di toko atau di ATM).

Kejutan terbesar, bagaimanapun, adalah perangkat lunaknya: Itu menjalankan Android versi stok tulang. Jika saya ingat dengan benar, pada saat itu, itu menjalankan Android 8, atau Android Oreo jika Anda lebih suka nama kode Google. Perangkat itu sendiri terlihat seperti perangkat POS portabel jadul, tetapi alih-alih keyboard fisik tempat Anda memasukkan PIN, perangkat ini menggunakan layar sentuh kapasitif seperti yang digunakan di ponsel Android sebelumnya.

Persyaratan saya mudah: Saya harus melihat apakah ada cara agar kami dapat menggunakan fitur perangkat ini seperti printer termal sambil menjalankan aplikasi yang sedang kami kembangkan. Segera setelah saya menyadari bahwa persyaratan itu sendiri mungkin, masalah lain muncul di perhatian saya: security .

Masalahnya, jika Anda memiliki perangkat yang menangani pembayaran kartu dan jenis transaksi lainnya, Anda mungkin tidak ingin perangkat yang sama dapat menjalankan TikTok, Gmail, atau Snapchat. Perangkat ini berperilaku persis seperti tablet, dan bahkan dilengkapi dengan Google Play Store yang sudah diinstal sebelumnya. Bayangkan pergi ke toko serba ada kecil dan melihat kasir Anda mengambil foto narsis, membuka email dari seorang pangeran Nigeria, dan menjelajahi situs web aneh yang dipenuhi malware.

Dan setelah itu, kasir memberi Anda perangkat yang sama untuk memasukkan PIN Anda. Secara pribadi, saya tidak akan merasa aman untuk memberikan informasi kartu kredit saya melalui perangkat semacam itu.

Mengunci Pengguna dari Menu Android

Selain keamanan, saya harus menghadapi tantangan yang lebih penting: saya harus mengunci orang tersebut menggunakan perangkat Android POS di dalam aplikasi saya. Bermain-main dengan sistem operasi bukanlah pilihan karena perangkat ini dikirim ke orang non-teknis.

Tentu, kasir lebih dari mampu menginstal aplikasi, tetapi kebanyakan dari mereka tidak dapat mem-flash ROM kustom atau menangani operasi tingkat rendah lainnya. Aplikasi itu sendiri ditulis dalam React Native, meskipun itu tidak relevan dalam konteks ini. Semua modifikasi yang saya buat menggunakan kode Java asli, jadi apa pun yang Anda gunakan untuk mengembangkan aplikasi utama Anda, tweak ini akan berfungsi.

Sebagai penafian kecil, prosedur ini hanya berfungsi untuk aplikasi Android . Apple tidak memberi kita kendali yang kita butuhkan untuk dengan mudah mencapai sesuatu seperti ini di iPhone atau iPad, yang dapat dimengerti mengingat sifat iOS yang tertutup.

Ada empat cara pengguna dapat keluar dari aplikasi:

  • Gunakan tombol Beranda .
  • Gunakan tombol Kembali .
  • Gunakan tombol Terbaru .
  • Keluar dari aplikasi Anda melalui bilah notifikasi .

Mengklik pemberitahuan terbaru atau membuka pengaturan dari bilah itu akan menyebabkan pengguna keluar dari aplikasi kita. Anda juga memiliki gerakan, tetapi pada akhirnya, gerakan ini memicu tindakan yang sama persis seperti penekanan tombol biasa.

Selain itu, memiliki sistem PIN untuk membuka kunci aplikasi dapat sangat berguna bagi seseorang untuk mengelola perangkat. Dengan cara ini, hanya seseorang yang memegang PIN yang dapat menginstal versi aplikasi yang berbeda, tanpa menawarkan akses yang lebih dalam kepada pengguna akhir.

Tombol Beranda

Untuk mencegah pengguna menekan tombol Beranda, kami tidak harus benar-benar menonaktifkannya.

Salah satu fitur Android yang berguna adalah ketersediaan peluncur yang berbeda. Biasanya, aplikasi ini memberi Anda layar beranda yang berbeda, laci aplikasi, dan akses ke berbagai penyesuaian UI. Setiap perangkat Android memiliki satu pra-instal oleh pabrikan. Pada akhirnya, ini hanyalah aplikasi biasa dan biasa dengan satu pengecualian kecil namun penting.

Artinya, jika sistem operasi dapat mengenali aplikasi kita sebagai peluncur, kita dapat mengaturnya sebagai peluncur default. Efek sampingnya adalah setiap kali Anda menekan tombol Beranda, perangkat akan membawa Anda ke peluncur Beranda. Dan jika aplikasi kita adalah peluncur Beranda, maka pada dasarnya, tombol Beranda ini menjadi tidak berguna. Untuk melakukannya, kita harus mengedit file XML AndroidManifest di proyek Android kita dan menambahkan dua baris kode ini:

 <activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>

Baris pertama akan membuat aplikasi kita memenuhi syarat untuk dipilih jika pengguna menekan tombol Beranda, dan baris kedua memungkinkan aplikasi kita disetel sebagai default setiap kali tindakan ini terjadi.

Sekarang, satu-satunya yang tersisa untuk dilakukan adalah agen lapangan menginstal aplikasi pada perangkat saat mengirimkannya ke klien. Setiap kali Anda menginstal aplikasi yang berpotensi menjadi peluncur, Android akan menanyakan apakah Anda ingin menggunakan peluncur lain dan apakah Anda ingin menetapkannya sebagai default.

Jadi sekarang, jika Anda menekan tombol Rumah atau jika Anda menghapus semua aplikasi terbaru Anda, perangkat akan secara otomatis mengarahkan Anda ke aplikasi saya.

Membangun Aplikasi POS Android yang Tidak Bisa Ditutup

Tombol Kembali

Selanjutnya, kita harus menangani tombol Kembali. Aplikasi seluler biasanya menyediakan cara di layar untuk kembali melalui layar, terutama karena banyak perangkat tidak memiliki tombol "kembali" khusus.

Beberapa tahun yang lalu, ini terjadi pada perangkat iOS Apple, yang menampilkan desain ikonik mereka dengan satu tombol fisik di bawah layar. Namun, dalam beberapa tahun terakhir, sebagian besar perangkat Android juga telah menjatuhkan tombol Home fisik. Pertama, mereka pindah ke tombol di layar, dan sekarang kami melihat mereka sedang menghapus ponsel demi gerakan, karena pembuat ponsel pindah ke perangkat semua layar dengan bezel dan dagu kecil.

Artinya, tombol Kembali yang disediakan Android secara default tidak benar-benar diperlukan, dan untuk membuat tombol ini sama sekali tidak berguna, kita hanya perlu menambahkan blok kode sederhana dalam aktivitas kita:

 @Override public void onBackPressed() { } 

Membangun Aplikasi POS Android yang Tidak Bisa Ditutup

Ini adalah blok kode yang cukup sederhana: Aktivitas utama kami memungkinkan kami untuk mencegat setiap kali pengguna menekan tombol Kembali. Dalam kasus kami, karena kami tidak ingin pengguna menekan tombol itu terlalu sering untuk keluar dari aplikasi, kami dapat dengan mudah menimpa metode default dengan metode yang tidak melakukan apa-apa, memberi tahu aplikasi kami untuk tidak melakukan apa pun jika tombol Kembali tombol ditekan.

Beginilah cara beberapa aplikasi meminta konfirmasi sebelum Anda secara tidak sengaja keluar darinya dengan terlalu sering kembali.

Tombol Terbaru

Kita masih perlu menangani tombol Recents, dan ini yang paling sulit. Juga, ini jelas bukan praktik terbaik atau sesuatu yang harus Anda dorong ke Play Store, tetapi ini berfungsi untuk kasus khusus kami di sini.

Cara yang sama seperti aktivitas utama memungkinkan kita mengetahui kapan tombol Kembali ditekan, itu juga memungkinkan kita mengetahui kapan aplikasi dijeda. Apa artinya ini? Kode ini dipicu setiap kali aplikasi kita beralih dari aplikasi latar depan menjadi latar belakang.

Saat mencegat acara ini, kami akan mendapatkan ID tugas dari aplikasi kami saat ini dan memberi tahu manajer aktivitas untuk memindahkan tugas ini ke depan. Untuk melakukan ini, kita memerlukan satu izin khusus di file manifes Android yang sama yang kita edit sebelumnya.

 <manifest xmlns:andro package="com.johnwick"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.REORDER_TASKS" /> <application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="false" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" /> </application> </manifest>

Ini akan memungkinkan kita untuk membaca tugas yang sedang berlangsung dan membuat perubahan pada tugas-tugas ini. Juga, kita masih perlu mencegat saat aplikasi kita sedang dikirim ke latar belakang. Kami kembali dapat mengganti metode onPause dalam aktivitas kami.

Di sini, kami mendapatkan pengelola tugas dan memaksanya untuk memindahkan tugas tertentu ke latar depan. Dalam kasus kami, tugas khusus itu adalah tugas yang baru saja dikirim ke latar belakang (aplikasi kami).

 @Override public void onPause() { super.onPause(); ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); activityManager.moveTaskToFront(getTaskId(), 0); }

Sekarang, setiap kali Anda ingin masuk ke menu terbaru, aplikasi akan memfokuskan kembali secara otomatis. Tentu, Anda mungkin mendapatkan sedikit kedipan layar, tetapi Anda tidak akan dapat keluar dari aplikasi ini. Dan inilah satu hal keren lainnya - ingat bagaimana saya mengatakan bahwa Anda juga dapat keluar dengan mengeklik notifikasi atau langsung membuka pengaturan melalui baki notifikasi? Nah, melakukan tindakan tersebut akan menempatkan aplikasi di latar belakang, yang akan memicu kode kita, dan kemudian pengguna didorong kembali.

Semua ini terjadi begitu cepat sehingga pengguna tidak akan menyadari apa yang terjadi di latar belakang. Juga, bagian bagus lainnya tentang pendekatan ini adalah bahwa sakelar cepat Anda masih tersedia. Anda masih dapat memilih jaringan wifi, misalnya, atau menonaktifkan suara, tetapi apa pun yang mengharuskan Anda masuk ke aplikasi Pengaturan sebenarnya tidak diperbolehkan.

Membangun Aplikasi POS Android yang Tidak Bisa Ditutup

Solusinya

Saya tidak yakin ini adalah cara terbaik untuk melakukannya, tetapi ini adalah proses yang sangat menarik saat meneliti topik yang bahkan tidak saya ketahui mungkin. Dan itu berhasil! Sebuah kata peringatan: Pada titik ini, hanya ada dua cara Anda dapat keluar dari aplikasi sebagai pengembang—Anda menginstal ulang sistem operasi atau mematikan/mencopot pemasangan aplikasi melalui ADB.

Jika Anda entah bagaimana kehilangan koneksi ADB ke perangkat, saya tidak mengetahui cara mudah yang bisa membuat Anda keluar. Untuk menghindari itu, saya akhirnya membangun sistem PIN.

Kasus Tepi

Ada beberapa situasi yang perlu kita pastikan untuk diperhitungkan. Pertama-tama, bagaimana jika perangkat di-boot ulang? Tidak harus reboot manual, itu juga bisa menjadi crash sistem operasi.

Karena kami menetapkan aplikasi kami sebagai peluncur default sebelumnya, segera setelah sistem operasi melakukan booting kembali, itu akan secara otomatis memulai aplikasi kami. Tapi bagaimana Android tahu untuk memuat layar beranda Anda saat boot? Itu karena pada dasarnya hanya memuat peluncur default Anda. Karena kami adalah peluncur default pada saat ini, reboot seharusnya tidak menjadi masalah. Dan bisakah Android mematikan aplikasi kita di beberapa titik? Secara teoritis, itu bisa mematikan aplikasi jika memori RAM penuh, tetapi dalam kehidupan nyata, ini hampir tidak mungkin. Karena aplikasi kami tidak dapat ditutup, tidak ada yang dapat membuka aplikasi lain, sehingga memori RAM tidak akan terisi.

Satu-satunya cara saya dapat memikirkannya adalah jika aplikasi kita memiliki kebocoran memori yang besar, tetapi dalam hal ini, Anda akan memiliki masalah yang lebih besar daripada menyimpan pengguna Anda di dalam aplikasi. Namun, bahkan jika Android entah bagaimana memicu sinyal mematikan ke aplikasi kita, setiap kali Anda mencoba untuk kembali ke rumah, OS akan mencoba untuk memulai aplikasi kita lagi karena ini adalah peluncur default, sehingga membuat pengguna tetap terkunci.

Membangun Pintu Belakang

Sebagai penjelasan singkat, ada tempat di pengaturan aplikasi di mana Anda bisa memasukkan PIN untuk membuka kunci aplikasi. Jika PIN benar, itu akan menonaktifkan batasan yang ditetapkan oleh metode onPause dan onBackPressed kami dengan melakukan pernyataan kondisional sederhana. Dari sana, pengguna akan diizinkan untuk masuk ke pengaturan melalui menu quick toggle. Setelah itu, Anda selalu dapat mengatur peluncur default kembali ke stok, dan itu akan membuat Anda benar-benar keluar dari aplikasi. Ada banyak cara untuk menangani bagian ini, tetapi ada baiknya memiliki mekanisme untuk menonaktifkan batasan yang sama yang Anda buat. Mungkin Anda bisa melakukan otentikasi sidik jari untuk membuka kunci. Kemungkinannya hampir tidak terbatas.

Membangun Aplikasi POS Android yang Tidak Bisa Ditutup

Membungkus

Akhirnya, saya ditinggalkan dengan aplikasi yang tidak dapat ditutup atau dimatikan oleh siapa pun. Bahkan me-reboot perangkat tidak akan membantu karena akan langsung menyala kembali ke peluncur default, yang saat ini merupakan aplikasi kita. Itu terbukti berguna untuk proyek kami, dan kepuasan mencoba sesuatu yang begitu aneh dan tidak sesuai dengan aturan memang hebat dan sangat memotivasi.

Ada banyak perangkat dan kasus penggunaan di mana Android telah mempermudah hidup pengembang. Saat ini, menulis aplikasi Android jauh lebih mudah daripada menggunakan banyak bahasa dan alat khusus platform yang berbeda. Pikirkan perangkat IoT, aplikasi kios, sistem titik penjualan, navigasi dan gateway pembayaran untuk taksi, dan banyak lagi.

Ini adalah kasus penggunaan di mana Android membuat pengembangan aplikasi lebih mudah, tetapi juga kasus penggunaan khusus di mana Anda ingin membatasi akses dengan cara yang mirip dengan apa yang kami tunjukkan dalam artikel ini.