إنشاء تطبيق Android POS لا يمكن إغلاقه

نشرت: 2022-03-11

إن عالم تطوير تطبيقات الأجهزة المحمولة واسع ومتطور باستمرار ، مع ظهور أطر وتقنيات جديدة على أساس يومي تقريبًا. عندما تفكر في جهاز محمول ، فمن المحتمل أن تفكر في هاتفك أو ربما جهازك اللوحي ، على الرغم من أنها لا تحظى بشعبية كبيرة مثل الهواتف الذكية.

يهيمن نظام التشغيل iOS من Apple و Android من Google على سوق الأجهزة المحمولة ، حيث شهد كل منهما صعودًا وهبوطًا على مدار العقد الماضي. اليوم ، سأتحدث أكثر عن Android واستخدامه على الأجهزة التي ليست بالضرورة محمولة.

كان لكونك مفتوح المصدر تأثير جانبي مثير للاهتمام حقًا على نظام تشغيل الهاتف المحمول من Google. بالتأكيد ، قد نفكر في جميع مفترقات Android المختلفة من شركات الهواتف الذكية المختلفة ، ولكن ماذا عن جميع الأجهزة التي تعمل بنظام Android والتي ليست محمولة؟ كل شيء بدءًا من الثلاجات أو الأفران الذكية أو أقفال الأبواب أو حتى أجهزة نقطة البيع (POS) يمكنها تشغيل Android في الوقت الحاضر. هذا الأخير هو سبب انتهائي من كتابة هذا المقال.

يمكن لأجهزة نقطة البيع (POS) تشغيل Android في الوقت الحاضر

أنظمة Android POS

منذ حوالي عام ، لعبت بجهاز Android لم يكن شيئًا عاديًا ، وهو ليس شيئًا من المرجح أن يستخدمه معظم الناس. الجهاز المعني هو نظام POS قائم على نظام Android من بائع صيني يحتوي أيضًا على طابعة حرارية متكاملة (مثل تلك المستخدمة لطباعة الإيصالات في المتاجر أو على أجهزة الصراف الآلي).

لكن المفاجأة الأكبر كانت برامجه: كان يشغل نسخة من نظام أندرويد. إذا كنت أتذكر بشكل صحيح ، في ذلك الوقت ، كان يعمل بنظام Android 8 ، أو Android Oreo إذا كنت تفضل أسماء رموز Google. يبدو الجهاز نفسه وكأنه جهاز POS محمول قديم للمدرسة ، ولكن بدلاً من لوحة المفاتيح الفعلية حيث ستدخل رقم التعريف الشخصي ، فإنه يحتوي على شاشة تعمل باللمس بالسعة مثل تلك المستخدمة في هواتف Android في الماضي.

كانت متطلباتي سهلة: كان عليّ معرفة ما إذا كانت هناك طريقة يمكننا من خلالها استخدام ميزات هذا الجهاز مثل الطابعة الحرارية أثناء تشغيل التطبيق الذي كنا نطوره أيضًا. بمجرد أن أدركت أن المطلب نفسه كان ممكنًا ، لفت انتباهي مشكلة أخرى: الأمن .

الشيء هو ، إذا كان لديك جهاز يتعامل مع مدفوعات البطاقات وأنواع أخرى من المعاملات ، فقد لا ترغب في أن يتمكن نفس الجهاز من تشغيل TikTok أو Gmail أو Snapchat. كان هذا الجهاز يتصرف تمامًا مثل الجهاز اللوحي ، وقد تم تثبيته مسبقًا على متجر Google Play Store. تخيل الذهاب إلى متجر صغير ورؤية أمين الصندوق الخاص بك يأخذ صورًا ذاتية ، ويفتح رسائل بريد إلكتروني من أمير نيجيري ، ويتصفح مواقع ويب غريبة ومليئة بالبرامج الضارة.

وبعد ذلك ، يمنحك أمين الصندوق نفس الجهاز لإدخال رقم التعريف الشخصي. أنا شخصياً لن أشعر بالأمان حيال تقديم معلومات بطاقتي الائتمانية عبر مثل هذا الجهاز.

قفل المستخدمين خارج قوائم Android

بصرف النظر عن الأمان ، كان علي أن أواجه تحديًا أكثر أهمية: اضطررت إلى قفل الشخص باستخدام جهاز Android POS داخل تطبيقي. لم يكن العبث بنظام التشغيل خيارًا حيث تم تسليم هذه الأجهزة إلى أشخاص غير تقنيين.

من المؤكد أن الصرافين أكثر قدرة على تثبيت أحد التطبيقات ، لكن معظمهم لا يستطيع فلاش روم مخصص أو التعامل مع عمليات أخرى منخفضة المستوى. تمت كتابة التطبيق نفسه بلغة React Native ، على الرغم من أن ذلك غير ذي صلة في هذا السياق. جميع التعديلات التي أجريتها في كود Java الأصلي ، لذلك بغض النظر عما تستخدمه لتطوير تطبيقك الرئيسي ، يجب أن تعمل هذه التعديلات.

كإخلاء بسيط ، يعمل هذا الإجراء فقط مع تطبيقات Android . لا تمنحنا Apple التحكم الذي نحتاجه لإنجاز شيء مثل هذا بسهولة على iPhone أو iPad ، وهو أمر مفهوم نظرًا للطبيعة المغلقة لنظام iOS.

هناك أربع طرق يمكن للمستخدم من خلالها الخروج من التطبيق:

  • استخدم زر الصفحة الرئيسية .
  • استخدم زر الرجوع .
  • استخدم زر Recents .
  • اترك تطبيقك من خلال شريط التنبيهات .

سيؤدي النقر فوق إشعار حديث أو الانتقال إلى الإعدادات من هذا الشريط إلى خروج المستخدم من تطبيقنا. لديك أيضًا إيماءات ، ولكن في نهاية اليوم ، تؤدي هذه الإيماءات إلى نفس الإجراءات تمامًا مثل الضغط على الأزرار العادية.

أيضًا ، يمكن أن يكون وجود نظام PIN لإلغاء قفل التطبيق مفيدًا حقًا لشخص ما لإدارة الجهاز. بهذه الطريقة ، لن يتمكن من تثبيت إصدار مختلف من التطبيق إلا شخص لديه رقم تعريف شخصي ، دون توفير وصول أعمق للمستخدم النهائي.

زر الصفحة الرئيسية

من أجل منع المستخدم من الضغط على زر الصفحة الرئيسية ، لا يتعين علينا تعطيله بالفعل.

تتمثل إحدى الميزات المفيدة في Android في توفر قاذفات مختلفة. عادةً ما توفر لك هذه التطبيقات شاشات رئيسية مختلفة وأدراج تطبيقات وإمكانية الوصول إلى تخصيصات واجهة المستخدم المختلفة. يحتوي كل جهاز يعمل بنظام Android على جهاز واحد مثبت مسبقًا من قبل الشركة المصنعة. في النهاية ، هذه مجرد تطبيقات عادية وعادية مع استثناء واحد صغير ولكنه حاسم.

ما يعنيه ذلك هو أنه إذا تمكن نظام التشغيل من التعرف على تطبيقنا على أنه مشغل ، فيمكننا تعيينه كمشغل افتراضي. التأثير الجانبي لهذا هو أنه في كل مرة تضغط فيها على زر الصفحة الرئيسية ، سينقلك الجهاز إلى مشغل الصفحة الرئيسية. وإذا كان تطبيقنا هو Home Launcher ، فعندئذٍ يصبح زر الصفحة الرئيسية هذا عديم الفائدة. للقيام بذلك ، يتعين علينا تحرير ملف AndroidManifest XML في مشروع Android الخاص بنا وإضافة هذين السطرين من التعليمات البرمجية:

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

سيجعل السطر الأول تطبيقنا مؤهلاً للاختيار في حالة ضغط المستخدم على زر الصفحة الرئيسية ، ويسمح السطر الثاني بتعيين تطبيقنا باعتباره التطبيق الافتراضي كلما حدث هذا الإجراء.

الآن ، الشيء الوحيد المتبقي هو أن يقوم الوكيل الميداني بتثبيت التطبيق على الجهاز عند تسليمه إلى العميل. عندما تقوم بتثبيت تطبيق لديه القدرة على أن يكون مشغلًا ، سيسألك Android عما إذا كنت تريد استخدام مشغل آخر وما إذا كنت تريد تعيين هذا التطبيق كبرنامج افتراضي.

الآن ، إذا ضغطت على زر الصفحة الرئيسية أو إذا قمت بمسح جميع التطبيقات الحديثة ، فسيقوم الجهاز تلقائيًا بتوجيهك إلى تطبيقي.

إنشاء تطبيق Android POS لا يمكن إغلاقه

زر الرجوع

بعد ذلك ، علينا التعامل مع زر الرجوع. عادةً ما توفر تطبيقات الأجهزة المحمولة طريقة تظهر على الشاشة للرجوع إلى الشاشات ، خاصة وأن العديد من الأجهزة لا تحتوي على مفتاح "رجوع" مخصص.

قبل بضع سنوات ، كان هذا هو الحال مع أجهزة Apple التي تعمل بنظام iOS ، والتي تميزت بتصميمها الأيقوني بالفعل مع زر مادي واحد أسفل الشاشة. ومع ذلك ، في السنوات الأخيرة ، أسقطت معظم أجهزة Android أزرار الصفحة الرئيسية المادية أيضًا. أولاً ، انتقلوا إلى الأزرار التي تظهر على الشاشة ، والآن نشاهدهم يتخلصون تدريجياً من الهواتف لصالح الإيماءات ، حيث ينتقل صانعو الهواتف إلى الأجهزة التي تعمل على الشاشة بالكامل ذات الحواف الصغيرة والذقن.

ما يعنيه هذا هو أن زر الرجوع الذي يوفره Android افتراضيًا ليس مطلوبًا حقًا ، ولجعل هذا الزر عديم الفائدة تمامًا ، نحتاج فقط إلى إضافة كتلة بسيطة من التعليمات البرمجية في نشاطنا:

 @Override public void onBackPressed() { } 

إنشاء تطبيق Android POS لا يمكن إغلاقه

هذه كتلة واضحة ومباشرة من التعليمات البرمجية: يسمح لنا نشاطنا الرئيسي بالاعتراض كلما ضغط المستخدم على الزر "رجوع". في حالتنا ، نظرًا لأننا لا نريد أن يضغط المستخدم على هذا الزر عدة مرات للخروج من التطبيق ، يمكننا ببساطة الكتابة فوق الطريقة الافتراضية بأخرى لا تفعل شيئًا ، وإخبار تطبيقنا بعدم القيام بأي شيء في حالة الرجوع يتم الضغط على الزر.

هذه هي الطريقة التي تطلب بها بعض التطبيقات التأكيد قبل الخروج منها بطريق الخطأ من خلال الرجوع عدة مرات.

زر Recents

ما زلنا بحاجة إلى التعامل مع زر Recents ، وهذا هو الأصعب. أيضًا ، هذه بالتأكيد ليست أفضل ممارسة أو شيء يجب عليك دفعه إلى متجر Play ، ولكنه يعمل من أجل حالتنا المتخصصة هنا.

بنفس الطريقة التي يسمح بها النشاط الرئيسي لنا بمعرفة وقت الضغط على زر الرجوع ، فإنه يتيح لنا أيضًا معرفة وقت إيقاف التطبيق مؤقتًا. ماذا يعني هذا؟ يتم تشغيل هذا الرمز في كل مرة يتحول فيها تطبيقنا من التطبيق الأمامي إلى التطبيق في الخلفية.

عند اعتراض هذا الحدث ، سنحصل على معرف المهمة لتطبيقنا الحالي ونخبر مدير النشاط بنقل هذه المهمة إلى المقدمة. للقيام بذلك ، نحتاج إلى إذن خاص واحد في نفس ملف بيان Android الذي قمنا بتحريره سابقًا.

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

سيسمح لنا ذلك بقراءة المهام الجارية وإجراء تغييرات على هذه المهام. أيضًا ، ما زلنا بحاجة إلى اعتراض اللحظة التي يتم فيها إرسال طلبنا إلى الخلفية. يمكننا تجاوز طريقة onPause مرة أخرى في نشاطنا.

هنا ، نحصل على مدير المهام ونجبره على نقل مهمة محددة إلى المقدمة. في حالتنا ، هذه المهمة المحددة هي المهمة التي تم إرسالها للتو إلى الخلفية (طلبنا).

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

الآن ، في كل مرة تريد فيها الانتقال إلى القائمة الأخيرة ، سيعيد التطبيق التركيز تلقائيًا. بالتأكيد ، قد تحصل على وميض صغير في الشاشة في بعض الأحيان ، لكنك لن تتمكن من الخروج من هذا التطبيق. وإليك شيئًا رائعًا آخر - تذكر كيف قلت أنه يمكنك أيضًا الخروج بالنقر فوق إشعار أو بالانتقال مباشرة إلى الإعدادات من خلال علبة الإشعارات؟ حسنًا ، سيؤدي تنفيذ هذه الإجراءات إلى وضع التطبيق في الخلفية ، مما يؤدي إلى تشغيل الكود الخاص بنا ، ومن ثم يتم دفع المستخدم مرة أخرى.

يحدث كل هذا بسرعة كبيرة بحيث لا يلاحظ المستخدم ما يحدث في الخلفية. أيضًا ، هناك جزء لطيف آخر حول هذا النهج وهو أن أدوات التبديل السريعة لا تزال متاحة. لا يزال بإمكانك تحديد شبكة wifi ، على سبيل المثال ، أو تعطيل الأصوات ، ولكن أي شيء يتطلب منك الدخول إلى تطبيق الإعدادات الفعلي غير مسموح به.

إنشاء تطبيق Android POS لا يمكن إغلاقه

الحل

لست متأكدًا من أن هذه هي أفضل طريقة للقيام بذلك ، لكنها كانت مع ذلك عملية ممتعة حقًا أثناء البحث عن موضوع لم أكن أعرف أنه ممكن. ويعمل! كلمة تحذير: في هذه المرحلة ، هناك طريقتان فقط يمكنك من خلالهما الخروج من التطبيق كمطور - إما إعادة تثبيت نظام التشغيل أو قتل / إلغاء تثبيت التطبيق من خلال ADB.

إذا فقدت اتصال ADB بالجهاز بطريقة ما ، فأنا لست على دراية بأي طريقة سهلة يمكن أن تخرجك. لتجنب ذلك ، انتهى بي الأمر ببناء نظام PIN.

حالات الحافة

هناك بعض المواقف التي نحتاجها للتأكد من أننا نأخذ في الحسبان. بادئ ذي بدء ، ماذا لو أعيد تشغيل الجهاز؟ ليس من الضروري أن تكون عملية إعادة تشغيل يدوية ، بل يمكن أن تكون أيضًا تعطلًا لنظام التشغيل.

نظرًا لأننا قمنا بتعيين تطبيقنا كمشغل افتراضي في وقت سابق ، فبمجرد بدء تشغيل نظام التشغيل احتياطيًا ، يجب أن يبدأ تطبيقنا تلقائيًا. ولكن كيف يعرف Android تحميل شاشتك الرئيسية عند الإقلاع؟ لأنه في الأساس يقوم فقط بتحميل المشغل الافتراضي الخاص بك. نظرًا لأننا المشغل الافتراضي في هذه المرحلة ، فلا ينبغي أن تكون عمليات إعادة التشغيل مشكلة. وهل يمكن أن يقتل Android تطبيقنا في مرحلة ما؟ من الناحية النظرية ، يمكن أن يقتل التطبيق إذا امتلأت ذاكرة الوصول العشوائي ، ولكن في الحياة الواقعية ، هذا شبه مستحيل. نظرًا لأن تطبيقنا غير قابل للإغلاق ، فلا يمكن لأي شخص فتح تطبيقات أخرى ، وبالتالي لا ينبغي ملء ذاكرة الوصول العشوائي.

الطريقة الوحيدة التي يمكنني التفكير بها في ملئه هي إذا كان تطبيقنا به تسرب كبير للذاكرة ، ولكن في هذه الحالة ، ستواجه مشكلات أكبر من إبقاء المستخدم داخل التطبيق. ومع ذلك ، حتى إذا أطلق Android بطريقة ما إشارة قتل لتطبيقنا ، فكلما حاولت العودة إلى المنزل ، سيحاول نظام التشغيل بدء تشغيل تطبيقنا مرة أخرى لأنه المشغل الافتراضي ، وبالتالي إبقاء المستخدم مغلقًا.

بناء باب خلفي

كتفسير سريع ، كان هناك مكان في إعدادات التطبيق حيث يمكنك إدخال رمز PIN لإلغاء قفل التطبيق. إذا كان رقم التعريف الشخصي صحيحًا ، فسوف يقوم بتعطيل القيود التي وضعتها طريقتنا onPause و onBackPressed عن طريق القيام ببيان شرطي بسيط. من هناك ، يُسمح للمستخدم بإدخال الإعدادات من خلال قائمة التبديل السريع. بعد ذلك ، يمكنك دائمًا إعادة تعيين المشغل الافتراضي إلى المخزون ، وسيخرجك ذلك تمامًا من التطبيق. هناك الكثير من الطرق التي يمكن للمرء أن يتعامل بها مع هذا الجزء ، ولكن من الجيد أن يكون لديك آلية لتعطيل نفس القيود التي تضعها. ربما يمكنك إجراء مصادقة بصمة الإصبع لإلغاء القفل. الاحتمالات لا حصر لها تقريبا.

إنشاء تطبيق Android POS لا يمكن إغلاقه

تغليف

في النهاية ، تركت لي تطبيقًا لا يمكن لأي شخص إغلاقه أو قتله. حتى إعادة تشغيل الجهاز لن يساعد لأنه سيعيد التشغيل مباشرة إلى المشغل الافتراضي ، وهو تطبيقنا حاليًا. لقد ثبت أنه مفيد لمشروعنا ، والرضا عن تجربة شيء غريب جدًا وخارج عن الخط كان حقًا رائعًا ومحفزًا للغاية.

هناك الكثير من الأجهزة وحالات الاستخدام التي يسهّل فيها Android حياة المطورين. في هذه الأيام ، تعد كتابة تطبيق Android أسهل بكثير من استخدام العديد من اللغات والأدوات الخاصة بالنظام الأساسي. فكر في أجهزة إنترنت الأشياء وتطبيقات الأكشاك وأنظمة نقاط البيع والملاحة وبوابات الدفع لسيارات الأجرة وغيرها الكثير.

هذه هي حالات الاستخدام التي جعل فيها Android تطوير التطبيق أسهل ، ولكنه أيضًا حالات استخدام متخصصة حيث تريد تقييد الوصول بطريقة مماثلة لما أظهرناه في هذه المقالة.