Kapatılamayan bir Android POS Uygulaması Oluşturma

Yayınlanan: 2022-03-11

Mobil uygulama geliştirme dünyası, neredeyse her gün ortaya çıkan yeni çerçeveler ve teknolojilerle birlikte geniş ve sürekli gelişmektedir. Bir mobil cihazı düşündüğünüzde, hiçbir yerde akıllı telefonlar kadar popüler olmasalar da muhtemelen telefonunuzu veya tabletinizi düşünürsünüz.

Apple'ın iOS'u ve Google'ın Android'i, her biri son on yılda iniş ve çıkışlar yaşayan mobil pazara hükmediyor. Bugün, Android ve mobil olması gerekmeyen cihazlarda kullanımı hakkında daha fazla konuşacağım.

Açık kaynak kodlu olmanın Google'ın mobil işletim sistemi üzerinde gerçekten ilginç bir yan etkisi oldu. Elbette, çeşitli akıllı telefon şirketlerinin tüm farklı Android çatallarını düşünebiliriz, ancak Android çalıştıran ve mobil olmayan tüm cihazlar ne olacak? Buzdolapları, akıllı fırınlar, kapı kilitleri ve hatta Satış Noktası (POS) cihazlarına kadar her şey bugünlerde Android çalıştırabilir. İkincisi, bu makaleyi yazmamın nedeni.

Satış Noktası (POS) cihazları günümüzde Android çalıştırabilir

Android POS Sistemleri

Yaklaşık bir yıl önce, sıradan olmayan bir Android cihazla oynadım ve çoğu insanın kullanacağı bir şey değil. Söz konusu cihaz, entegre bir termal yazıcıya (mağazalarda veya ATM'lerde makbuz yazdırmak için kullanılanlar gibi) sahip olan Çinli bir satıcıya ait Android tabanlı bir POS sistemidir.

Yine de en büyük sürpriz yazılımıydı: Android'in kemik stoğu sürümünü çalıştırıyordu. Doğru hatırlıyorsam, o zamanlar Android 8 veya Google kod adlarını tercih ederseniz Android Oreo çalıştırıyordu. Cihazın kendisi eski bir taşınabilir POS cihazına benziyor, ancak PIN'inizi gireceğiniz fiziksel klavye yerine, eski Android telefonlarda kullanılanlar gibi kapasitif bir dokunmatik ekrana sahip.

İhtiyacım kolaydı: Geliştirdiğimiz uygulamayı çalıştırırken bu cihazın termal yazıcı gibi özelliklerini kullanmanın bir yolu olup olmadığını görmem gerekiyordu. Gereksinimin kendisinin mümkün olduğunu anladığım anda, dikkatimi başka bir sorun çekti: güvenlik .

Mesele şu ki, kart ödemelerini ve diğer türdeki işlemleri gerçekleştiren bir cihazınız varsa, aynı cihazın TikTok, Gmail veya Snapchat'i çalıştırabilmesini istemeyebilirsiniz. Bu cihaz tam olarak bir tablet gibi davranıyordu ve hatta Google'ın Play Store'u önceden yüklenmiş olarak geldi. Küçük bir markete gittiğinizi ve kasiyerinizin selfie çektiğini, Nijeryalı bir prensten gelen e-postaları açtığını ve garip, kötü amaçlı yazılım yüklü web sitelerine göz attığını hayal edin.

Ardından kasiyer, PIN'inizi girmeniz için size aynı cihazı verir. Şahsen ben böyle bir cihaz üzerinden kredi kartı bilgilerimi verme konusunda kendimi güvende hissetmem.

Kullanıcıları Android Menülerinden Kilitleme

Güvenlik bir yana, daha da önemli bir görevi üstlenmem gerekiyordu: Android POS cihazını kullanan kişiyi uygulamamın içinde kilitlemem gerekiyordu. Bu cihazlar teknik bilgisi olmayan kişilere teslim edildiğinden işletim sistemiyle uğraşmak bir seçenek değildi.

Tabii ki, kasiyerler bir uygulama yüklemekten daha fazlasını yapabilir, ancak çoğu özel ROM'ları flaş edemez veya diğer alt düzey işlemleri gerçekleştiremez. Uygulamanın kendisi, bu bağlamda alakasız olmasına rağmen, React Native ile yazılmıştır. Yaptığım tüm değişiklikler yerel Java kodundadır, bu nedenle ana uygulamanızı geliştirmek için ne kullanırsanız kullanın, bu ince ayarlar çalışmalıdır.

Küçük bir sorumluluk reddi olarak, bu prosedür yalnızca Android uygulamaları için geçerlidir . Apple, iOS'un kapalı doğası göz önüne alındığında anlaşılabilir olan bir iPhone veya iPad'de böyle bir şeyi kolayca başarmak için ihtiyacımız olan kontrolü bize vermiyor.

Bir kullanıcının bir uygulamadan çıkmasının dört yolu vardır:

  • Ana Sayfa düğmesini kullanın.
  • Geri düğmesini kullanın.
  • Son Kullanılanlar düğmesini kullanın.
  • Uygulamanızı bildirim çubuğundan bırakın.

Son bir bildirime tıklamak veya o çubuktan ayarlara gitmek, kullanıcının uygulamamızdan çıkmasına neden olur. Hareketleriniz de var, ancak günün sonunda, bu hareketler, normal düğme basışlarıyla aynı eylemleri tetikliyor.

Ayrıca, uygulamanın kilidini açmak için bir PIN sistemine sahip olmak, birinin cihazı yönetmesi için gerçekten yararlı olabilir. Bu şekilde, son kullanıcıya daha derin bir erişim sunmadan, yalnızca bir PIN'e sahip olan biri uygulamanın farklı bir sürümünü yükleyebilir.

Ana Sayfa Düğmesi

Bir kullanıcının Ana Sayfa düğmesine basmasını önlemek için, onu gerçekten devre dışı bırakmamız gerekmez.

Android'in kullanışlı bir özelliği, farklı başlatıcıların kullanılabilirliğidir. Genellikle bu uygulamalar size farklı ana ekranlar, uygulama çekmeceleri ve çeşitli UI özelleştirmelerine erişim sağlar. Her Android cihazında üretici tarafından önceden yüklenmiş bir tane bulunur. Sonuç olarak, bunlar küçük ama çok önemli bir istisna dışında sadece normal, normal uygulamalardır.

Bunun anlamı, işletim sistemi uygulamamızı bir başlatıcı olarak tanıyabilirse, onu varsayılan bir başlatıcı olarak ayarlayabiliriz. Bunun yan etkisi, Ana Ekran düğmesine her bastığınızda, cihazın sizi Ana Sayfa başlatıcısına götürmesidir. Ve uygulamamız Ana Başlatıcı ise, temel olarak bu Ana Sayfa düğmesi işe yaramaz hale gelir. Bunu yapmak için Android projemizdeki AndroidManifest XML dosyasını düzenlememiz ve şu iki kod satırını eklememiz gerekiyor:

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

İlk satır, kullanıcının Ana Sayfa düğmesine basması durumunda uygulamamızın seçilmeye uygun olmasını sağlar ve ikinci satır, bu işlem gerçekleştiğinde uygulamamızın varsayılan olarak ayarlanmasına izin verir.

Artık saha temsilcisinin uygulamayı istemciye teslim ederken cihaza yüklemesi için yapılması gereken tek şey kalmıştı. Başlatıcı olma potansiyeline sahip bir uygulama yüklediğinizde, Android size başka bir başlatıcı kullanmak isteyip istemediğinizi ve bunu varsayılan olarak ayarlamak isteyip istemediğinizi soracaktır.

Şimdi, Ana Sayfa düğmesine basarsanız veya tüm son uygulamalarınızı temizlediyseniz, cihaz sizi otomatik olarak uygulamama yönlendirir.

Kapatılamayan bir Android POS Uygulaması Oluşturma

Geri Düğmesi

Ardından, Geri düğmesini ele almalıyız. Mobil uygulamalar, özellikle birçok cihazda özel bir "geri" tuşu bulunmadığından, ekranlar arasında geri gitmek için genellikle bir ekran yolu sağlar.

Birkaç yıl önce, Apple'ın zaten ikonik tasarımlarını ekranın altında tek bir fiziksel düğmeyle sunan iOS cihazlarında durum buydu. Ancak, son yıllarda çoğu Android cihazı fiziksel Ana Sayfa düğmelerini de düşürdü. İlk olarak, ekran düğmelerine geçtiler ve şimdi, telefon üreticileri küçük çerçeveli ve çeneli tam ekranlı cihazlara geçerken, telefonların aşamalı olarak jestler lehine kullanıldığını görüyoruz.

Bunun anlamı, Android'in varsayılan olarak sağladığı Geri düğmesine gerçekten ihtiyaç duyulmamasıdır ve bu düğmeyi tamamen işe yaramaz hale getirmek için etkinliğimize basit bir kod bloğu eklememiz yeterlidir:

 @Override public void onBackPressed() { } 

Kapatılamayan bir Android POS Uygulaması Oluşturma

Bu oldukça basit bir kod bloğudur: Ana faaliyetimiz, bir kullanıcı Geri düğmesine her bastığında araya girmemizi sağlar. Bizim durumumuzda, kullanıcının uygulamadan çıkmak için bu düğmeye çok fazla basmasını istemediğimiz için, varsayılan yöntemin üzerine hiçbir şey yapmayan bir yöntem yazabilir ve geri olması durumunda uygulamamıza hiçbir şey yapmamasını söyleyebiliriz. düğmesine basılır.

Bu, bazı uygulamaların siz yanlışlıkla çok fazla geri giderek onlardan çıkmadan önce onay istemesidir.

Son Kullanılanlar Düğmesi

Hala Son Aramalar düğmesini kullanmamız gerekiyor ve bu en zor olanı. Ayrıca, bu kesinlikle en iyi uygulama veya Play Store'a göndermeniz gereken bir şey değil, ancak buradaki niş durumumuz için işe yarıyor.

Ana aktivitenin Geri düğmesine ne zaman basıldığını bilmemize izin vermesiyle aynı şekilde, uygulamanın ne zaman duraklatıldığını da bilmemizi sağlar. Ne anlama geliyor? Bu kod, uygulamamız ön plandaki uygulamadan arka planda olmaya her geçiş yaptığında tetiklenir.

Bu olayı durdururken, mevcut uygulamamızın görev kimliğini alacağız ve aktivite yöneticisine bu görevi öne taşımasını söyleyeceğiz. Bunu yapmak için, daha önce düzenlediğimiz aynı Android bildirim dosyasında özel bir izne ihtiyacımız var.

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

Bu, devam eden görevleri okumamıza ve bu görevlerde değişiklik yapmamıza izin verecektir. Ayrıca, uygulamamızın arka plana gönderildiği anı yakalamamız gerekiyor. Aktivitemizde onPause yöntemini tekrar geçersiz kılabiliriz.

Burada görev yöneticisini alıyoruz ve belirli bir görevi ön plana taşımaya zorluyoruz. Bizim durumumuzda, bu belirli görev, arka plana (bizim uygulamamız) yeni gönderilen görevdir.

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

Artık sonlar menüsüne her gitmek istediğinizde, uygulama otomatik olarak yeniden odaklanacaktır. Elbette, zaman zaman küçük bir ekran titriyor olabilir, ancak bu uygulamadan çıkamayacaksınız. Ve işte harika bir şey daha - bir bildirime tıklayarak veya doğrudan bildirim tepsisinden ayarlara giderek de çıkabileceğinizi söylediğimi hatırlıyor musunuz? Peki, bu eylemleri gerçekleştirmek, uygulamayı arka plana koyacak, bu da kodumuzu tetikleyecek ve ardından kullanıcı tekrar içeri itilecek.

Tüm bunlar o kadar hızlı gerçekleşir ki kullanıcı arka planda ne olduğunu fark etmez. Ayrıca, bu yaklaşımın bir başka güzel yanı, hızlı geçişlerinizin hala kullanılabilir olmasıdır. Örneğin, yine de bir wifi ağı seçebilir veya sesleri devre dışı bırakabilirsiniz, ancak gerçek Ayarlar uygulamasına girmenizi gerektiren hiçbir şeye izin verilmez.

Kapatılamayan bir Android POS Uygulaması Oluşturma

Çözüm

Bunu yapmanın en iyi yolu olduğundan emin değilim, ancak yine de mümkün olduğunu bile bilmediğim bir konuyu araştırırken gerçekten ilginç bir süreçti. Ve çalışıyor! Bir uyarı: Bu noktada, geliştirici olarak uygulamadan çıkmanın yalnızca iki yolu vardır; işletim sistemini yeniden yüklersiniz veya uygulamayı ADB aracılığıyla kapatırsınız/kaldırırsınız.

Cihazla olan ADB bağlantısını bir şekilde kaybederseniz, sizi çıkarabilecek kolay bir yolun farkında değilim. Bundan kaçınmak için bir PIN sistemi oluşturdum.

Kenar Kılıfları

Hesap verdiğimizden emin olmamız gereken birkaç durum var. Her şeyden önce, bir cihaz yeniden başlatılırsa ne olur? Manuel bir yeniden başlatma olması gerekmez, işletim sisteminin çökmesi de olabilir.

Uygulamamızı daha önce varsayılan başlatıcı olarak belirlediğimiz için işletim sistemi yeniden başlatılır açılmaz uygulamamızı otomatik olarak başlatması gerekir. Ancak Android, açılışta ana ekranınızı yüklemeyi nasıl biliyor? Bunun nedeni, temelde yalnızca varsayılan başlatıcınızı yüklemesidir. Bu noktada varsayılan başlatıcı olduğumuz için yeniden başlatmalar bir sorun olmamalıdır. Ve Android, uygulamamızı bir noktada öldürebilir mi? Teorik olarak, RAM belleği dolarsa uygulamayı öldürebilir, ancak gerçek hayatta bu neredeyse imkansızdır. Uygulamamız kapatılamaz olduğundan kimse başka uygulamaları açamaz ve bu nedenle RAM belleği dolmamalıdır.

Doldurmayı düşünmemin tek yolu, uygulamamızın çok büyük bir bellek sızıntısı olup olmadığıdır, ancak bu durumda, kullanıcınızı uygulamanın içinde tutmaktan daha büyük sorunlarınız olacaktır. Yine de, Android bir şekilde uygulamamıza bir öldürme sinyali tetiklese bile, eve geri dönmeye çalıştığınızda işletim sistemi, varsayılan başlatıcı olduğu için uygulamamızı yeniden başlatmayı deneyecek ve böylece kullanıcıyı kilitli tutacaktır.

Arka Kapı İnşa Etme

Hızlı bir açıklama olarak, uygulamanın kilidini açmak için uygulama ayarlarında bir PIN girebileceğiniz bir yer vardı. PIN doğruysa, basit bir koşullu ifade yaparak onPause ve onBackPressed yöntemlerimiz tarafından belirlenen sınırlamaları devre dışı bırakacaktır. Oradan, bir kullanıcının hızlı geçiş menüsü aracılığıyla ayarlara girmesine izin verilir. Daha sonra, varsayılan başlatıcıyı her zaman hisse senedine geri ayarlayabilirsiniz ve bu sizi uygulamadan tamamen çıkarır. Bu kısmı halletmenin birçok yolu vardır, ancak sizin koyduğunuz sınırlamaları devre dışı bırakacak bir mekanizmaya sahip olmak iyidir. Belki kilidi açmak için bir parmak izi doğrulaması yapabilirsiniz. Olasılıklar neredeyse sonsuzdur.

Kapatılamayan bir Android POS Uygulaması Oluşturma

Toplama

Sonunda kimsenin kapatamayacağı veya öldüremeyeceği bir uygulama ile baş başa kaldım. Cihazı yeniden başlatmak bile, şu anda bizim uygulamamız olan varsayılan başlatıcıya doğrudan yeniden açılacağı için yardımcı olmaz. Projemiz için faydalı olduğunu kanıtladı ve bu kadar tuhaf ve sıra dışı bir şeyi denemenin verdiği tatmin gerçekten harika ve oldukça motive ediciydi.

Android'in geliştiricilerin hayatını kolaylaştırdığı pek çok cihaz ve kullanım örneği var. Bu günlerde, bir Android uygulaması yazmak, platforma özgü birçok farklı dil ve araç kullanmaktan çok daha kolay. IoT cihazlarını, kiosk uygulamalarını, satış noktası sistemlerini, taksiler için navigasyon ve ödeme ağ geçitlerini ve daha fazlasını düşünün.

Bunlar, Android'in uygulama geliştirmeyi kolaylaştırdığı kullanım örnekleridir, ancak aynı zamanda bu makalede gösterdiklerimize benzer şekilde erişimi kısıtlamak isteyeceğiniz niş kullanım durumlarıdır.