การสร้างแอป Android POS ที่ไม่สามารถปิดได้
เผยแพร่แล้ว: 2022-03-11โลกของการพัฒนาแอพมือถือนั้นกว้างใหญ่และมีการพัฒนาอยู่ตลอดเวลา ด้วยเฟรมเวิร์กและเทคโนโลยีใหม่ๆ ที่ผุดขึ้นมาแทบทุกวัน เมื่อคุณนึกถึงอุปกรณ์เคลื่อนที่ คุณอาจนึกถึงโทรศัพท์หรือแท็บเล็ตของคุณ แม้ว่าอุปกรณ์เหล่านี้จะไม่ค่อยได้รับความนิยมเท่าสมาร์ทโฟนก็ตาม
iOS ของ Apple และ Android ของ Google ครองตลาดอุปกรณ์พกพา โดยแต่ละส่วนต่างก็มีขึ้นมีลงในช่วงทศวรรษที่ผ่านมา วันนี้ฉันจะมาพูดถึง Android และการใช้งานบนอุปกรณ์ที่ไม่จำเป็นต้องเป็นอุปกรณ์พกพา
การเป็นโอเพ่นซอร์สมีผลข้างเคียงที่น่าสนใจมากกับระบบปฏิบัติการมือถือของ Google แน่นอนว่าเราอาจนึกถึงส้อม Android ที่แตกต่างกันทั้งหมดจากบริษัทสมาร์ทโฟนหลายแห่ง แต่อุปกรณ์ทั้งหมดที่ใช้ Android ที่ไม่ใช่มือถือล่ะ ตั้งแต่ตู้เย็น เตาอบอัจฉริยะ ล็อคประตู หรือแม้แต่อุปกรณ์ ณ จุดขาย (POS) ก็สามารถเรียกใช้ Android ได้ในปัจจุบัน อย่างหลังคือเหตุผลที่ฉันลงเอยด้วยการเขียนบทความนี้
ระบบ POS ของ Android
ประมาณหนึ่งปีที่แล้ว ฉันต้องเล่นกับอุปกรณ์ Android ที่ไม่ธรรมดา และไม่ใช่สิ่งที่คนส่วนใหญ่จะใช้ อุปกรณ์ที่เป็นปัญหาคือระบบ POS ที่ใช้ Android จากผู้ขายชาวจีนที่มีเครื่องพิมพ์เทอร์มอลในตัว (เช่น เครื่องพิมพ์ที่ใช้พิมพ์ใบเสร็จที่ร้านค้าหรือตู้เอทีเอ็ม)
ความประหลาดใจที่ใหญ่ที่สุดคือซอฟต์แวร์ของมัน: มันใช้งาน Android เวอร์ชันกระดูก ถ้าฉันจำไม่ผิด ตอนนั้นมันใช้ Android 8 หรือ Android Oreo หากคุณต้องการชื่อรหัสของ Google ตัวอุปกรณ์เองนั้นดูเหมือนอุปกรณ์ POS แบบพกพาของโรงเรียนเก่า แต่แทนที่จะเป็นแป้นพิมพ์จริงที่คุณจะป้อน PIN ของคุณ อุปกรณ์นี้มีหน้าจอสัมผัสแบบ capacitive เหมือนกับที่ใช้ในโทรศัพท์ Android ของปีที่แล้ว
ความต้องการของฉันนั้นง่ายมาก ฉันต้องดูว่ามีวิธีที่เราสามารถใช้คุณสมบัติของอุปกรณ์นี้ เช่น เครื่องพิมพ์เทอร์มอล ในขณะที่ใช้งานแอพที่เรากำลังพัฒนาอยู่ได้หรือไม่ ทันทีที่ฉันตระหนักว่าข้อกำหนดนั้นเป็นไปได้ ฉันก็พบปัญหาอื่น: ความปลอดภัย
สิ่งสำคัญคือ หากคุณมีอุปกรณ์ที่จัดการการชำระเงินด้วยบัตรและธุรกรรมประเภทอื่นๆ คุณอาจไม่ต้องการให้อุปกรณ์เดียวกันนั้นสามารถเรียกใช้ TikTok, Gmail หรือ Snapchat อุปกรณ์นี้มีการทำงานเหมือนกับแท็บเล็ต และยังมาพร้อมกับ Play Store ของ Google ที่ติดตั้งไว้ล่วงหน้าอีกด้วย ลองนึกภาพการไปร้านสะดวกซื้อเล็กๆ และเห็นแคชเชียร์ถ่ายเซลฟี่ เปิดอีเมลจากเจ้าชายไนจีเรีย และท่องเว็บไซต์แปลก ๆ ที่มีมัลแวร์
และหลังจากนั้น แคชเชียร์จะมอบอุปกรณ์เครื่องเดียวกันให้คุณเพื่อป้อน PIN โดยส่วนตัวแล้วฉันรู้สึกไม่ปลอดภัยที่จะให้ข้อมูลบัตรเครดิตผ่านอุปกรณ์ดังกล่าว
การล็อคผู้ใช้ออกจากเมนู Android
นอกเหนือจากความปลอดภัยแล้ว ฉันยังต้องเผชิญกับความท้าทายที่สำคัญกว่านั้นอีก นั่นคือ ฉันต้องล็อกบุคคลที่ใช้อุปกรณ์ Android POS ภายในแอปของฉัน การล้อเล่นกับระบบปฏิบัติการไม่ใช่ทางเลือก เนื่องจากอุปกรณ์เหล่านี้ถูกส่งไปยังผู้ที่ไม่ใช่ช่างเทคนิค
แน่นอนว่าแคชเชียร์เป็นมากกว่าการติดตั้งแอปพลิเคชัน แต่ส่วนใหญ่ไม่สามารถแฟลช ROM แบบกำหนดเองหรือจัดการการทำงานระดับล่างอื่นๆ ได้ ตัวแอปเองนั้นเขียนด้วยภาษา React Native แม้ว่าจะไม่เกี่ยวข้องในบริบทนี้ก็ตาม การแก้ไขทั้งหมดที่ฉันทำอยู่ในโค้ด Java ดั้งเดิม ดังนั้นไม่ว่าคุณจะใช้อะไรในการพัฒนาแอปพลิเคชันหลัก การปรับแต่งเหล่านี้ก็ควรใช้งานได้
เป็นข้อจำกัดความรับผิดชอบเล็กน้อย ขั้นตอนนี้ ใช้ได้กับแอป Android เท่านั้น Apple ไม่ได้ให้การควบคุมที่เราจำเป็นต้องทำสิ่งนี้ให้สำเร็จอย่างง่ายดายบน iPhone หรือ iPad ซึ่งเข้าใจได้เนื่องจากลักษณะปิดของ iOS
มีสี่วิธีที่ผู้ใช้สามารถออกจากแอปพลิเคชัน:
- ใช้ปุ่ม โฮม
- ใช้ปุ่ม ย้อนกลับ
- ใช้ปุ่ม ล่าสุด
- ออกจากแอปของคุณผ่าน แถบการแจ้งเตือน
การคลิกที่การแจ้งเตือนล่าสุดหรือไปที่การตั้งค่าจากแถบนั้นจะทำให้ผู้ใช้ออกจากแอปพลิเคชันของเรา คุณยังมีท่าทางสัมผัสด้วย แต่เมื่อสิ้นสุดวัน ท่าทางสัมผัสเหล่านี้จะทริกเกอร์การทำงานแบบเดียวกันกับการกดปุ่มปกติ
นอกจากนี้ การมีระบบ PIN เพื่อปลดล็อกแอปพลิเคชันยังมีประโยชน์อย่างมากสำหรับคนที่จะจัดการอุปกรณ์ ด้วยวิธีนี้ เฉพาะผู้ที่มี PIN เท่านั้นจึงจะสามารถติดตั้งแอปพลิเคชันเวอร์ชันอื่นได้ โดยไม่ต้องให้การเข้าถึงที่ลึกซึ้งยิ่งขึ้นแก่ผู้ใช้ปลายทาง
ปุ่มโฮม
เพื่อป้องกันไม่ให้ผู้ใช้กดปุ่มโฮม เราไม่จำเป็นต้องปิดการใช้งานจริงๆ
คุณลักษณะที่มีประโยชน์อย่างหนึ่งของ Android คือความพร้อมใช้งานของตัวเรียกใช้งานต่างๆ โดยปกติ แอปเหล่านี้จะมอบหน้าจอหลัก ลิ้นชักแอป และการเข้าถึงการปรับแต่ง UI ต่างๆ ให้คุณ อุปกรณ์ Android ทุกเครื่องมีผู้ผลิตติดตั้งไว้ล่วงหน้าหนึ่งเครื่อง ท้ายที่สุดแล้ว แอปเหล่านี้เป็นเพียงแอปปกติทั่วไปที่มีข้อยกเว้นเพียงเล็กน้อยแต่สำคัญมาก
หมายความว่าหากระบบปฏิบัติการสามารถรับรู้แอปพลิเคชันของเราว่าเป็นตัวเรียกใช้งาน เราสามารถตั้งค่าให้เป็นตัวเรียกใช้เริ่มต้นได้ ผลข้างเคียงคือทุกครั้งที่คุณกดปุ่มโฮม อุปกรณ์จะนำคุณไปที่ตัวเปิดใช้หน้าแรก และหากแอปพลิเคชันของเราเป็นตัวเปิดใช้หน้าแรก โดยทั่วไปแล้ว ปุ่มโฮมนี้จะไร้ประโยชน์ ในการทำเช่นนั้น เราต้องแก้ไขไฟล์ 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 จะถามคุณว่าคุณต้องการใช้ตัวเรียกใช้งานอื่นหรือไม่ และคุณต้องการตั้งค่าให้เป็นค่าเริ่มต้นหรือไม่
ดังนั้นตอนนี้ หากคุณกดปุ่มโฮมหรือหากคุณล้างแอปพลิเคชันล่าสุดทั้งหมด อุปกรณ์จะนำคุณไปยังแอปพลิเคชันของฉันโดยอัตโนมัติ
ปุ่มย้อนกลับ
ต่อไปเราต้องจัดการกับปุ่มย้อนกลับ แอปบนอุปกรณ์เคลื่อนที่มักจะแสดงวิธีการย้อนกลับบนหน้าจอ โดยเฉพาะอย่างยิ่งเนื่องจากอุปกรณ์จำนวนมากไม่มีคีย์ "ย้อนกลับ" โดยเฉพาะ
เมื่อไม่กี่ปีที่ผ่านมา เหตุการณ์นี้เกิดขึ้นกับอุปกรณ์ iOS ของ Apple ซึ่งมีการออกแบบที่โดดเด่นอยู่แล้วด้วยปุ่มทางกายภาพเพียงปุ่มเดียวด้านล่างหน้าจอ อย่างไรก็ตาม ในช่วงไม่กี่ปีที่ผ่านมา อุปกรณ์ Android ส่วนใหญ่ได้ทิ้งปุ่มโฮมที่มีอยู่จริงด้วยเช่นกัน อย่างแรก พวกมันย้ายไปที่ปุ่มบนหน้าจอ และตอนนี้เราเห็นพวกเขากำลังเลิกใช้โทรศัพท์แทนการใช้ท่าทาง ในขณะที่ผู้ผลิตโทรศัพท์ย้ายไปที่อุปกรณ์ทุกหน้าจอที่มีกรอบและคางเล็ก
หมายความว่าไม่จำเป็นต้องใช้ปุ่มย้อนกลับที่ Android มีให้โดยค่าเริ่มต้น และเพื่อให้ปุ่มนี้ไร้ประโยชน์โดยสิ้นเชิง เราเพียงแค่เพิ่มบล็อกโค้ดง่ายๆ ในกิจกรรมของเรา:
@Override public void onBackPressed() { }

นี่เป็นบล็อคโค้ดที่ค่อนข้างตรงไปตรงมา: กิจกรรมหลักของเราช่วยให้เราสามารถสกัดกั้นเมื่อใดก็ตามที่ผู้ใช้กดปุ่มย้อนกลับ ในกรณีของเรา เนื่องจากเราไม่ต้องการให้ผู้ใช้กดปุ่มนั้นหลายครั้งเกินไปเพื่อออกจากแอป เราสามารถเขียนทับวิธีการเริ่มต้นโดยใช้วิธีที่ไม่ทำอะไรเลย โดยบอกให้แอปของเราไม่ทำอะไรเลยในกรณีที่มีการย้อนกลับ กดปุ่ม
นี่เป็นวิธีที่บางแอปพลิเคชันขอคำยืนยันก่อนที่คุณจะออกจากแอปพลิเคชันโดยไม่ได้ตั้งใจโดยการย้อนกลับหลายครั้งเกินไป
ปุ่มล่าสุด
เรายังคงต้องจัดการกับปุ่มล่าสุดและนี่เป็นปุ่มที่ยากที่สุด นอกจากนี้ นี่ไม่ใช่แนวทางปฏิบัติที่ดีที่สุดหรือบางอย่างที่คุณควรส่งไปยัง Play Store อย่างแน่นอน แต่วิธีนี้ใช้ได้ผลสำหรับกรณีเฉพาะของเราที่นี่
เช่นเดียวกับที่กิจกรรมหลักช่วยให้เราทราบเมื่อกดปุ่มย้อนกลับ ยังช่วยให้เราทราบเมื่อแอปหยุดชั่วคราว สิ่งนี้หมายความว่า? รหัสนี้จะถูกเรียกใช้ทุกครั้งที่แอปของเราเปลี่ยนจากการเป็นแอปพลิเคชันเบื้องหน้าเป็นเบื้องหลัง
เมื่อสกัดกั้นเหตุการณ์นี้ เราจะได้รับ ID งานของแอปพลิเคชันปัจจุบันของเรา และบอกให้ตัวจัดการกิจกรรมย้ายงานนี้ไปไว้ข้างหน้า ในการดำเนินการนี้ เราต้องได้รับอนุญาตพิเศษหนึ่งรายการในไฟล์รายการ 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 ได้ ตัวอย่างเช่น หรือปิดเสียง แต่สิ่งใดก็ตามที่คุณจำเป็นต้องเข้าสู่แอปการตั้งค่าจริงจะไม่อนุญาต
การแก้ไขปัญหา
ฉันไม่แน่ใจว่านี่เป็นวิธีที่ดีที่สุด แต่ก็ยังเป็นกระบวนการที่น่าสนใจจริงๆ ในขณะที่ค้นคว้าหัวข้อที่ฉันไม่รู้ด้วยซ้ำว่าจะเป็นไปได้ และมันก็ได้ผล! คำเตือน: ณ จุดนี้ มีเพียงสองวิธีที่คุณสามารถออกจากแอปพลิเคชันในฐานะนักพัฒนา นั่นคือคุณติดตั้งระบบปฏิบัติการใหม่ หรือคุณจะฆ่า/ถอนการติดตั้งแอปผ่าน ADB
หากคุณสูญเสียการเชื่อมต่อ ADB กับอุปกรณ์ ฉันไม่ทราบวิธีง่ายๆ ที่จะนำคุณออกไป เพื่อหลีกเลี่ยงปัญหานั้น ฉันจึงสร้างระบบ PIN
เคสขอบ
มีบางสถานการณ์ที่เราต้องตรวจสอบให้แน่ใจว่าเรารับผิดชอบ ก่อนอื่น จะเกิดอะไรขึ้นหากอุปกรณ์รีบูท ไม่จำเป็นต้องรีบูตด้วยตนเอง แต่ก็อาจเป็นความผิดพลาดของระบบปฏิบัติการได้
เนื่องจากเราตั้งค่าแอปพลิเคชันของเราเป็นตัวเรียกใช้เริ่มต้นก่อนหน้านี้ ทันทีที่ระบบปฏิบัติการบูทสำรอง แอปพลิเคชันควรเริ่มแอปพลิเคชันของเราโดยอัตโนมัติ แต่ Android รู้ได้อย่างไรว่าต้องโหลดหน้าจอหลักของคุณตอนบูต เป็นเพราะว่าโดยพื้นฐานแล้วเพียงแค่โหลดตัวเรียกใช้เริ่มต้นของคุณ เนื่องจากเราเป็นตัวเรียกใช้เริ่มต้น ณ จุดนี้ การรีบูตจึงไม่ควรเป็นปัญหา และ Android สามารถฆ่าแอปพลิเคชันของเราได้หรือไม่? ในทางทฤษฎี แอปอาจฆ่าแอปได้หากหน่วยความจำ RAM เต็ม แต่ในชีวิตจริง นี่แทบจะเป็นไปไม่ได้เลย เนื่องจากแอปของเราไม่สามารถปิดได้ จึงไม่มีใครสามารถเปิดแอปอื่นๆ ได้ ดังนั้นหน่วยความจำ RAM จึงไม่ควรเต็ม
วิธีเดียวที่ฉันคิดว่ามันจะเต็มคือถ้าแอปพลิเคชันของเรามีหน่วยความจำรั่วมาก แต่ในกรณีนั้น คุณจะมีปัญหาที่ใหญ่กว่าการรักษาผู้ใช้ของคุณไว้ในแอปพลิเคชัน ถึงกระนั้น แม้ว่า Android จะทริกเกอร์สัญญาณการฆ่าไปยังแอปพลิเคชันของเรา เมื่อใดก็ตามที่คุณพยายามกลับบ้าน ระบบปฏิบัติการจะพยายามเริ่มแอปของเราอีกครั้งเนื่องจากเป็นลอนเชอร์เริ่มต้น ซึ่งทำให้ผู้ใช้ถูกล็อค
สร้างประตูหลัง
เพื่อเป็นการอธิบายอย่างรวดเร็ว มีสถานที่ในการตั้งค่าแอปพลิเคชันที่คุณสามารถป้อน PIN เพื่อปลดล็อกแอปได้ หาก PIN ถูกต้อง มันจะปิดการใช้งานข้อจำกัดที่กำหนดโดยวิธีการ onPause และ onBackPressed ของเราด้วยการทำคำสั่งแบบมีเงื่อนไขอย่างง่าย จากนั้น ผู้ใช้จะได้รับอนุญาตให้เข้าสู่การตั้งค่าผ่านเมนูสลับด่วน หลังจากนั้น คุณสามารถตั้งค่าตัวเรียกใช้งานเริ่มต้นกลับเป็นค่าเริ่มต้นได้เสมอ และนั่นจะทำให้คุณออกจากแอพได้อย่างสมบูรณ์ มีหลายวิธีที่เราสามารถจัดการกับส่วนนี้ได้ แต่ควรมีกลไกในการปิดใช้ข้อจำกัดเดียวกันกับที่คุณกำหนดไว้ บางทีคุณอาจทำการตรวจสอบลายนิ้วมือเพื่อปลดล็อก ความเป็นไปได้แทบจะไม่มีที่สิ้นสุด
ห่อ
ในที่สุด ฉันถูกทิ้งให้อยู่กับแอปพลิเคชันที่ไม่มีใครปิดหรือฆ่าได้ แม้แต่การรีบูทอุปกรณ์ก็ไม่ช่วยอะไร เพราะมันจะเปิดขึ้นมาโดยตรงที่ตัวเรียกใช้งานเริ่มต้น ซึ่งปัจจุบันคือแอปพลิเคชันของเรา มันพิสูจน์แล้วว่ามีประโยชน์สำหรับโครงการของเรา และความพึงพอใจในการทดลองใช้บางสิ่งที่แปลกประหลาดและไม่เหมือนใครนั้นยอดเยี่ยมมากและมีแรงจูงใจสูง
มีอุปกรณ์และกรณีการใช้งานมากมายที่ Android ทำให้ชีวิตของนักพัฒนาง่ายขึ้น ทุกวันนี้ การเขียนแอปพลิเคชัน Android ทำได้ง่ายกว่าการใช้ภาษาและเครื่องมือเฉพาะแพลตฟอร์มต่างๆ มากมาย ลองนึกถึงอุปกรณ์ IoT, แอปพลิเคชันคีออสก์, ระบบ ณ จุดขาย, การนำทางและเกตเวย์การชำระเงินสำหรับแท็กซี่ และอื่นๆ อีกมากมาย
กรณีเหล่านี้คือกรณีการใช้งานที่ Android ทำให้การพัฒนาแอปง่ายขึ้น แต่ยังรวมถึงกรณีการใช้งานเฉพาะที่คุณต้องการจำกัดการเข้าถึงในลักษณะเดียวกันกับที่เราแสดงให้เห็นในบทความนี้