ภาพรวมไฟล์ Manifest ของแอป

โปรเจ็กต์แอปทุกโปรเจ็กต์ต้องมีไฟล์ AndroidManifest.xml ที่มีชื่อดังกล่าวที่รูทของชุดแหล่งที่มาของโปรเจ็กต์ ไฟล์ Manifest จะอธิบายข้อมูลสำคัญเกี่ยวกับแอปของคุณให้กับเครื่องมือสร้าง Android, ระบบปฏิบัติการ Android และ Google Play

และไฟล์ Manifest จำเป็นต้องประกาศสิ่งต่อไปนี้

  • คอมโพเนนต์ของแอป ซึ่งรวมถึงกิจกรรม บริการ ผู้รับสัญญาณออกอากาศ และผู้ให้บริการเนื้อหาทั้งหมด คอมโพเนนต์แต่ละรายการต้องกำหนดพร็อพเพอร์ตี้พื้นฐาน เช่น ชื่อคลาส Kotlin หรือ Java นอกจากนี้ยังประกาศความสามารถต่างๆ ได้ด้วย เช่น การกำหนดค่าอุปกรณ์ที่จัดการได้ และตัวกรองความตั้งใจที่อธิบายวิธีเริ่มต้นใช้งานคอมโพเนนต์ อ่านเพิ่มเติมเกี่ยวกับคอมโพเนนต์ของแอปในส่วนถัดไป
  • สิทธิ์ที่แอปจําเป็นต้องใช้เพื่อเข้าถึงส่วนที่ได้รับการปกป้องของระบบหรือแอปอื่นๆ และยังประกาศสิทธิ์ที่แอปอื่นๆ ต้องมีหากต้องการเข้าถึงเนื้อหาจากแอปนี้ด้วย อ่านเพิ่มเติมเกี่ยวกับสิทธิ์ในส่วนถัดไป
  • ฟีเจอร์ฮาร์ดแวร์และซอฟต์แวร์ที่แอปต้องใช้ ซึ่งส่งผลต่ออุปกรณ์ที่ติดตั้งแอปจาก Google Play ได้ อ่านเพิ่มเติมเกี่ยวกับความเข้ากันได้ของอุปกรณ์ในส่วนถัดไป

หากคุณใช้ Android Studio เพื่อสร้างแอป ระบบจะสร้างไฟล์ Manifest ให้คุณและเพิ่มองค์ประกอบ Manifest ที่สำคัญส่วนใหญ่ขณะที่คุณสร้างแอป โดยเฉพาะเมื่อใช้เทมเพลตโค้ด

ฟีเจอร์ของไฟล์

ส่วนต่อไปนี้อธิบายลักษณะที่สำคัญที่สุดบางอย่างของแอปที่แสดงในไฟล์ Manifest

คอมโพเนนต์ของแอป

สำหรับคอมโพเนนต์แอปแต่ละรายการที่คุณสร้างในแอป ให้ประกาศองค์ประกอบ XML ที่เกี่ยวข้องในไฟล์ Manifest ดังนี้

หากคุณสร้างคลาสย่อยของคอมโพเนนต์เหล่านี้โดยไม่ประกาศในไฟล์ Manifest ระบบจะไม่สามารถเริ่มคอมโพเนนต์ดังกล่าวได้

ระบุชื่อของคลาสย่อยด้วยแอตทริบิวต์ name ใช้การระบุแพ็กเกจแบบเต็ม เช่น ประกาศคลาสย่อย Activity ดังนี้

<manifest ... >
    <application ... >
        <activity android:name="com.example.myapp.MainActivity" ... >
        </activity>
    </application>
</manifest>

อย่างไรก็ตาม หากอักขระตัวแรกในค่า name เป็นเครื่องหมายจุด เนมสเปซของแอปจากพร็อพเพอร์ตี้ namespace ของไฟล์ระดับโมดูล build.gradle จะมีคำนำหน้าเป็นชื่อ เช่น หากเนมสเปซคือ "com.example.myapp" ชื่อกิจกรรมต่อไปนี้จะเปลี่ยนเป็น com.example.myapp.MainActivity

<manifest ... >
    <application ... >
        <activity android:name=".MainActivity" ... >
            ...
        </activity>
    </application>
</manifest>

ดูข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าชื่อแพ็กเกจหรือเนมสเปซได้ที่ตั้งค่าเนมสเปซ

หากคุณมีคอมโพเนนต์แอปที่อยู่ในแพ็กเกจย่อย เช่น ใน com.example.myapp.purchases ค่า name จะต้องเพิ่มชื่อแพ็กเกจย่อยที่ขาดหายไป เช่น ".purchases.PayActivity" หรือใช้ชื่อแพ็กเกจที่สมบูรณ์

ตัวกรอง Intent

Intent จะเปิดใช้งานกิจกรรม แอป บริการ และตัวรับการออกอากาศ Intent คือข้อความที่กำหนดโดยออบเจ็กต์ Intent ซึ่งอธิบายถึงการดำเนินการที่ต้องทำ รวมถึงข้อมูลที่จะดำเนินการ หมวดหมู่ของคอมโพเนนต์ที่คาดว่าจะดำเนินการ และวิธีการอื่นๆ

เมื่อแอปส่ง Intent ไปยังระบบ ระบบจะค้นหาคอมโพเนนต์แอปที่จัดการ Intent ได้ โดยอิงตามประกาศตัวกรอง Intent ในไฟล์ Manifest ของแต่ละแอป ระบบจะเปิดใช้งานอินสแตนซ์ของคอมโพเนนต์ที่ตรงกันและส่งออบเจ็กต์ Intent ไปยังคอมโพเนนต์นั้น หากมีแอปมากกว่า 1 แอปที่จัดการ Intent ได้ ผู้ใช้จะเลือกแอปที่จะใช้ได้

คอมโพเนนต์แอปอาจมีตัวกรอง Intent กี่รายการก็ได้ (กำหนดด้วยองค์ประกอบ <intent-filter>) โดยแต่ละรายการจะอธิบายความสามารถที่แตกต่างกันของคอมโพเนนต์นั้น

ดูข้อมูลเพิ่มเติมได้ที่เอกสารIntent และตัวกรอง Intent

ไอคอนและป้ายกำกับ

เอลิเมนต์ไฟล์ Manifest บางรายการมีแอตทริบิวต์ icon และ label สำหรับแสดงไอคอนขนาดเล็กและป้ายกำกับข้อความตามลำดับต่อผู้ใช้สำหรับคอมโพเนนต์แอปที่เกี่ยวข้อง

ในทุกกรณี ไอคอนและป้ายกำกับที่ตั้งค่าไว้ในองค์ประกอบหลักจะเป็นค่าเริ่มต้นสำหรับ icon และ label ขององค์ประกอบย่อยทั้งหมด ตัวอย่างเช่น ไอคอนและป้ายกํากับที่ตั้งค่าไว้ในองค์ประกอบ <application> คือไอคอนและป้ายกํากับเริ่มต้นสําหรับคอมโพเนนต์แต่ละรายการของแอป เช่น กิจกรรมทั้งหมด

ไอคอนและป้ายกำกับที่ตั้งค่าไว้ใน <intent-filter> ของคอมโพเนนต์จะแสดงต่อผู้ใช้เมื่อใดก็ตามที่คอมโพเนนต์นั้นแสดงเป็นตัวเลือกเพื่อบรรลุความตั้งใจ โดยค่าเริ่มต้น ไอคอนนี้จะรับมาจากไอคอนใดก็ตามที่ประกาศไว้สำหรับคอมโพเนนต์หลัก ซึ่งอาจเป็นองค์ประกอบ <activity> หรือ <application>

คุณอาจต้องเปลี่ยนไอคอนสำหรับตัวกรอง Intent หากมีการดำเนินการที่ไม่ซ้ำกันซึ่งคุณต้องการระบุให้ชัดเจนขึ้นในกล่องโต้ตอบตัวเลือก ดูข้อมูลเพิ่มเติมได้ที่อนุญาตให้แอปอื่นๆ เริ่มกิจกรรมของคุณ

สิทธิ์

แอป Android ต้องขอสิทธิ์ในการเข้าถึงข้อมูลที่ละเอียดอ่อนของผู้ใช้ เช่น รายชื่อติดต่อและ SMS หรือฟีเจอร์บางอย่างของระบบ เช่น กล้องและการเข้าถึงอินเทอร์เน็ต สิทธิ์แต่ละรายการจะระบุด้วยป้ายกำกับที่ไม่ซ้ำกัน ตัวอย่างเช่น แอปที่ต้องส่งข้อความ SMS ต้องมีบรรทัดต่อไปนี้ในไฟล์ Manifest

<manifest ... >
    <uses-permission android:name="android.permission.SEND_SMS"/>
    ...
</manifest>

ตั้งแต่ Android 6.0 (API ระดับ 23) เป็นต้นไป ผู้ใช้จะอนุมัติหรือปฏิเสธสิทธิ์บางอย่างของแอปขณะที่รันไทม์ได้ แต่ไม่ว่าแอปของคุณจะรองรับ Android เวอร์ชันใด คุณต้องประกาศคําขอสิทธิ์ทั้งหมดด้วยองค์ประกอบ <uses-permission> ในไฟล์ Manifest หากได้รับสิทธิ์ แอปจะใช้ฟีเจอร์ที่ได้รับการปกป้องได้ หากไม่ อุปกรณ์จะพยายามเข้าถึงฟีเจอร์เหล่านั้นไม่สำเร็จ

นอกจากนี้ แอปยังปกป้องคอมโพเนนต์ของตัวเองด้วยสิทธิ์ได้ด้วย แอปสามารถใช้สิทธิ์ใดก็ได้ที่ Android กำหนดไว้ตามที่แสดงในandroid.Manifest.permission หรือสิทธิ์ที่ประกาศไว้ในแอปอื่น นอกจากนี้ แอปยังกำหนดสิทธิ์ของตนเองได้ด้วย ประกาศสิทธิ์ใหม่ด้วยองค์ประกอบ <permission>

ดูข้อมูลเพิ่มเติมได้ที่สิทธิ์ใน Android

ความเข้ากันได้ของอุปกรณ์

ไฟล์ Manifest ยังเป็นที่ที่คุณสามารถประกาศประเภทคุณลักษณะของฮาร์ดแวร์หรือซอฟต์แวร์ ที่แอปต้องใช้ และตามส่วนขยาย จะระบุประเภทอุปกรณ์ ที่เข้ากันได้ Google Play Store ไม่อนุญาตให้ผู้ใช้ติดตั้งแอปของคุณในอุปกรณ์ที่ไม่มีฟีเจอร์หรือเวอร์ชันระบบที่แอปของคุณต้องใช้

มีแท็กไฟล์ Manifest หลายรายการที่กำหนดว่าแอปของคุณรองรับอุปกรณ์ใดบ้าง ตัวอย่างที่พบบ่อยมีดังนี้

<uses-feature>

องค์ประกอบ <uses-feature> ช่วยให้คุณประกาศฟีเจอร์ด้านฮาร์ดแวร์และซอฟต์แวร์ที่แอปต้องการได้ เช่น หากแอปไม่มีฟังก์ชันพื้นฐานในอุปกรณ์ที่ไม่มีเซ็นเซอร์เข็มทิศ คุณสามารถประกาศเซ็นเซอร์เข็มทิศได้ตามต้องการด้วยแท็กไฟล์ Manifest ต่อไปนี้

<manifest ... >
    <uses-feature android:name="android.hardware.sensor.compass"
                  android:required="true" />
    ...
</manifest>

หมายเหตุ: หากต้องการให้แอปพร้อมให้บริการใน Chromebook คุณควรพิจารณาข้อจำกัดที่สำคัญบางอย่างของฮาร์ดแวร์และฟีเจอร์ซอฟต์แวร์ ดูข้อมูลเพิ่มเติมได้ที่ความเข้ากันได้ของไฟล์ Manifest ของแอปสำหรับ Chromebook

<uses-sdk>

แพลตฟอร์มแต่ละเวอร์ชันที่อัปเดตใหม่มักจะเพิ่ม API ใหม่ที่ไม่มีในเวอร์ชันก่อนหน้า หากต้องการระบุเวอร์ชันขั้นต่ำที่แอปใช้งานร่วมกันได้ ไฟล์ Manifest ต้องมีแท็ก <uses-sdk> และแอตทริบิวต์ minSdkVersion ของแท็ก

อย่างไรก็ตาม โปรดทราบว่าพร็อพเพอร์ตี้ที่เกี่ยวข้องในไฟล์ build.gradle จะลบล้างแอตทริบิวต์ในองค์ประกอบ <uses-sdk> ดังนั้นหากคุณใช้ Android Studio ให้ระบุค่า minSdkVersion และ targetSdkVersion แทน ดังนี้

Groovy

android {
    defaultConfig {
        applicationId 'com.example.myapp'

        // Defines the minimum API level required to run the app.
        minSdkVersion 21

        // Specifies the API level used to test the app.
        targetSdkVersion 33
        ...
    }
}

Kotlin

android {
    defaultConfig {
        applicationId = "com.example.myapp"

        // Defines the minimum API level required to run the app.
        minSdkVersion(21)

        // Specifies the API level used to test the app.
        targetSdkVersion(33)
        ...
    }
}

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับไฟล์ build.gradle โปรดอ่านวิธีกำหนดค่าบิลด์

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีประกาศการรองรับอุปกรณ์ต่างๆ ของแอปได้ที่ภาพรวมความเข้ากันได้ของอุปกรณ์

รูปแบบไฟล์

ส่วนนี้อธิบายถึงแบบแผนและกฎที่ใช้กับองค์ประกอบและแอตทริบิวต์ทั้งหมดในไฟล์ Manifest โดยทั่วไป

องค์ประกอบ
ต้องมีองค์ประกอบ <manifest> และ <application>เท่านั้น โดยแต่ละรายการต้องปรากฏเพียงครั้งเดียว องค์ประกอบอื่นๆ ส่วนใหญ่อาจเกิดขึ้นตั้งแต่ 0 ครั้งขึ้นไป อย่างไรก็ตาม ต้องมีองค์ประกอบบางอย่างเพื่อให้ไฟล์ Manifest มีประโยชน์

ค่าทั้งหมดจะตั้งค่าผ่านแอตทริบิวต์ ไม่ใช่เป็นข้อมูลอักขระภายในองค์ประกอบ

โดยทั่วไปองค์ประกอบที่ระดับเดียวกันจะไม่เรียงลำดับกัน ตัวอย่างเช่น องค์ประกอบ <activity>, <provider> และ <service> จะเรียงลำดับอย่างไรก็ได้ ข้อยกเว้นสำคัญ 2 ข้อของกฎนี้ ได้แก่

  • องค์ประกอบ <activity-alias> ต้องตามหลัง <activity> ที่ใช้เป็นอีเมลแทน
  • องค์ประกอบ <application> ต้องเป็นองค์ประกอบสุดท้ายภายในองค์ประกอบ <manifest>
แอตทริบิวต์
ในทางเทคนิคแล้ว คุณจะระบุแอตทริบิวต์ทั้งหมดหรือไม่ก็ได้ อย่างไรก็ตาม คุณต้องระบุแอตทริบิวต์หลายรายการเพื่อให้องค์ประกอบทำงานได้ตามวัตถุประสงค์ สําหรับแอตทริบิวต์ที่ไม่บังคับอย่างแท้จริง เอกสารอ้างอิงจะระบุค่าเริ่มต้น

ชื่อแอตทริบิวต์ทั้งหมดจะขึ้นต้นด้วยคำนำหน้า android: ยกเว้นแอตทริบิวต์บางรายการขององค์ประกอบรูท <manifest> เช่น android:alwaysRetainTaskState เนื่องจากคำนำหน้านี้ใช้ได้กับทุกที่ เอกสารประกอบจึงมักจะไม่ใส่คำนำหน้านี้เมื่ออ้างอิงถึงแอตทริบิวต์ตามชื่อ

มีหลายค่า
หากระบุค่าได้มากกว่า 1 ค่า องค์ประกอบจะซ้ำกันเกือบทุกครั้ง แทนที่จะแสดงค่าหลายค่าภายในองค์ประกอบเดียว ตัวอย่างเช่น ตัวกรอง Intent สามารถแสดงรายการการดำเนินการหลายรายการได้ ดังนี้
<intent-filter ... >
    <action android:name="android.intent.action.EDIT" />
    <action android:name="android.intent.action.INSERT" />
    <action android:name="android.intent.action.DELETE" />
    ...
</intent-filter>
ค่าทรัพยากร
แอตทริบิวต์บางรายการมีค่าที่แสดงต่อผู้ใช้ เช่น ชื่อกิจกรรมหรือไอคอนแอป ค่าสำหรับแอตทริบิวต์เหล่านี้อาจแตกต่างกันไปตามภาษาของผู้ใช้หรือการกําหนดค่าอุปกรณ์อื่นๆ (เช่น เพื่อระบุขนาดไอคอนที่แตกต่างกันตามความหนาแน่นของพิกเซลของอุปกรณ์) ดังนั้นจึงควรตั้งค่าจากทรัพยากรหรือธีมแทนการเขียนโค้ดลงในไฟล์ Manifest จากนั้นค่าจริงอาจเปลี่ยนแปลงตามแหล่งข้อมูลทางเลือกที่คุณระบุไว้สําหรับการกําหนดค่าอุปกรณ์ที่แตกต่างกัน

ทรัพยากรจะแสดงเป็นค่าในรูปแบบต่อไปนี้

"@[package:]type/name"

คุณละเว้นชื่อ package ได้หากแอปของคุณมีทรัพยากรนั้น (รวมถึงในกรณีที่ทรัพยากรมาจาก Dependency ของไลบรารี เนื่องจากทรัพยากรของไลบรารีจะผสานรวมกับของคุณ) ชื่อแพ็กเกจอื่นที่ถูกต้องมีเพียง android เท่านั้น ในกรณีที่คุณต้องการใช้ทรัพยากรจากเฟรมเวิร์ก Android

type คือประเภททรัพยากร เช่น string หรือ drawable และ name คือชื่อที่ระบุทรัพยากรที่เฉพาะเจาะจง มีตัวอย่างดังต่อไปนี้

<activity android:icon="@drawable/smallPic" ... >

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีเพิ่มทรัพยากรลงในโปรเจ็กต์ได้ที่ภาพรวมทรัพยากรแอป

หากต้องการใช้ค่าที่กําหนดไว้ในธีมแทน อักขระแรกต้อง?แทนที่จะเป็น @

"?[package:]type/name"

ค่าสตริง
ในกรณีที่ค่าแอตทริบิวต์เป็นสตริง ให้ใช้เครื่องหมายแบ็กสแลชคู่ (\\) เพื่อหลีกอักขระ เช่น \\n สำหรับบรรทัดใหม่ หรือ \\uxxxx สำหรับอักขระ Unicode

การอ้างอิงองค์ประกอบไฟล์ Manifest

ตารางต่อไปนี้แสดงลิงก์ไปยังเอกสารอ้างอิงสำหรับองค์ประกอบที่ถูกต้องทั้งหมดในไฟล์ AndroidManifest.xml

<action> เพิ่มการดำเนินการลงในตัวกรอง Intent
<activity> ประกาศคอมโพเนนต์กิจกรรม
<activity-alias> ประกาศอีเมลแทนสําหรับกิจกรรม
<application> ประกาศแอปพลิเคชัน
<category> เพิ่มชื่อหมวดหมู่ลงในตัวกรอง Intent
<compatible-screens> ระบุการกำหนดค่าหน้าจอแต่ละรายการที่แอปพลิเคชันใช้งานร่วมกันได้
<data> เพิ่มข้อกำหนดของข้อมูลลงในตัวกรอง Intent
<grant-uri-permission> ระบุข้อมูลชุดย่อยของแอปที่ผู้ให้บริการเนื้อหาระดับบนสุดมีสิทธิ์เข้าถึง
<instrumentation> ประกาศคลาส Instrumentation ที่ให้คุณตรวจสอบการโต้ตอบของแอปพลิเคชันกับระบบ
<intent-filter> ระบุประเภทของ Intent ที่กิจกรรม บริการ หรือตัวรับการออกอากาศสามารถตอบสนองได้
<manifest> องค์ประกอบรูทของไฟล์ AndroidManifest.xml
<meta-data> คู่ชื่อ-ค่าสำหรับรายการข้อมูลเพิ่มเติมที่ไม่เจาะจงซึ่งสามารถส่งไปยังคอมโพเนนต์หลักได้
<path-permission> กำหนดเส้นทางและสิทธิ์ที่จำเป็นสำหรับชุดย่อยของข้อมูลที่ต้องการภายในผู้ให้บริการเนื้อหา
<permission> ประกาศสิทธิ์ด้านความปลอดภัยที่สามารถใช้เพื่อจํากัดการเข้าถึงคอมโพเนนต์หรือฟีเจอร์ที่เฉพาะเจาะจงของแอปพลิเคชันนี้หรือแอปพลิเคชันอื่นๆ
<permission-group> ประกาศชื่อสําหรับการจัดกลุ่มสิทธิ์ที่เกี่ยวข้องอย่างมีเหตุผล
<permission-tree> ประกาศชื่อฐานสำหรับลําดับชั้นของสิทธิ์
<provider> ประกาศคอมโพเนนต์ผู้ให้บริการเนื้อหา
<queries> ประกาศชุดแอปอื่นๆ ที่แอปของคุณตั้งใจจะเข้าถึง ดูข้อมูลเพิ่มเติมในคู่มือเกี่ยวกับการกรองระดับการมองเห็นแพ็กเกจ
<receiver> ประกาศคอมโพเนนต์ Broadcast Receiver
<service> ประกาศคอมโพเนนต์บริการ
<supports-gl-texture> ประกาศรูปแบบการบีบอัดพื้นผิว GL รูปแบบเดียวที่แอปรองรับ
<supports-screens> ประกาศขนาดหน้าจอที่แอปรองรับและเปิดใช้โหมดความเข้ากันได้ของหน้าจอสำหรับหน้าจอที่ใหญ่กว่าขนาดที่แอปรองรับ
<uses-configuration> ระบุฟีเจอร์อินพุตที่เฉพาะเจาะจงที่แอปพลิเคชันต้องการ
<uses-feature> ประกาศฟีเจอร์ฮาร์ดแวร์หรือซอฟต์แวร์เดียวที่แอปพลิเคชันใช้
<uses-library> ระบุไลบรารีที่ใช้ร่วมกันซึ่งแอปพลิเคชันต้องลิงก์ด้วย
<uses-native-library> ระบุไลบรารีที่ใช้ร่วมกันแบบเนทีฟที่ผู้ให้บริการต้องลิงก์กับแอป
<uses-permission> ระบุสิทธิ์ของระบบที่ผู้ใช้ต้องให้เพื่อให้แอปทำงานได้อย่างถูกต้อง
<uses-permission-sdk-23> ระบุว่าแอปต้องการสิทธิ์บางอย่างเฉพาะในกรณีที่ติดตั้งแอปในอุปกรณ์ที่ใช้ Android 6.0 (API ระดับ 23) ขึ้นไปเท่านั้น
<uses-sdk> ช่วยให้คุณระบุความเข้ากันได้ของแอปพลิเคชันกับแพลตฟอร์ม Android อย่างน้อย 1 เวอร์ชันได้โดยใช้จำนวนเต็มระดับ API

ข้อจำกัด

แท็กต่อไปนี้มีการจํากัดจํานวนครั้งที่ปรากฏในไฟล์ Manifest

ชื่อแท็ก ขีดจำกัด
<package> 1000
<meta-data> 1000
<uses-library> 1000

แอตทริบิวต์ต่อไปนี้มีขีดจำกัดความยาวสูงสุด

แอตทริบิวต์ ขีดจำกัด
name 1024
versionName 1024
host 255
mimeType 255

ตัวอย่างไฟล์ Manifest

XML ด้านล่างคือตัวอย่างง่ายๆ AndroidManifest.xml ที่ประกาศกิจกรรม 2 รายการสำหรับแอป

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1"
    android:versionName="1.0">

    <!-- Beware that these values are overridden by the build.gradle file -->
    <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="26" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <!-- This name is resolved to com.example.myapp.MainActivity
             based on the namespace property in the build.gradle file -->
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".DisplayMessageActivity"
            android:parentActivityName=".MainActivity" />
    </application>
</manifest>