13 January 2014

Android Manifest ประกอบไปด้วยอะไรบ้าง (สำหรับผู้เริ่มต้น)

Updated on


        บทความนี้เจ้าของบล็อกก็ขอกลับมาสู่เรื่องพื้นฐานกันต่อบ้างนะ โดยจะพูดถึงเรื่องไฟล์ AndroidManifest.xml ที่คุ้นเคยกันดี ว่ามันมีส่วนประกอบพื้นฐานอะไรบ้าง เมื่อสร้างโปรเจคขึ้นมาใหม่ๆเพื่อให้ผู้ที่หลงเข้ามาอ่านมือใหม่ได้ศึกษาการทำงานคร่าวๆก่อน

        AndroidManifest.xml เป็นไฟล์จัดการการทำงานโดยรวมของแอปพลิเคชัน ซึ่งจะกำหนดคุณสมบัติต่างๆของแอปพลิเคชันไว้ในไฟล์นี้เป็นหลัก อย่างเช่น ชื่อแอปพลิเคชัน, เวอร์ชันของแอปพลิเคชัน, API ที่รองรับ Activity ที่จะให้ทำงาน, ขออนุญาติใช้งานบางอย่าง (Permission) เป็นต้น ซึ่งจะเป็นการทำงานโดยรวมของแอปพลิเคชันเท่านั้น ส่วนการเขียนโค๊ดหรือรูปแบบหน้าตาแอปพลิเคชันจะไม่เกี่ยว

        โดยโค๊ดที่อยู่ใน Android Manifest จะอยู่ในรูป XML ดังนี้

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

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.simple.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

        อันนี้เป็น Android Manifest แบบพื้นฐานสุดๆที่สร้างขึ้นมาพร้อมกับโปรเจค ทีนี้มาดูกันบ้างว่าแต่ละส่วนคืออะไร

        ก่อนอื่นให้ทำความเข้าใจกับโครงสร้างของ XML กันก่อนละกัน

        * จริงๆต้องเป็น application ไม่ใช่ Application พอดีพิมพ์ผิดแต่ขี้เกียจแก้ไข XD


        ตรง Open element tag เจ้าของบล็อกจะเรียกสั้นๆว่า Tag เปิดนะครับ โดย Tag จะมีขอบเขตอยู่ที่ปีกกาเปิดและปิด <Tag> ในตัวอย่างก็คือเป็น Tag ที่กำหนดเกี่ยวกับ Application โดย Attribute Name คือคุณสมบัติต่างๆของ Tag นั้นๆ และ Attribute Value ก็คือค่าที่ต้องการกำหนดให้กับคุณสมบัตินั้นๆของ Tag โดยทุกๆ Tag จะต้องมี Tag ปิด หรือที่เรียกว่า Closing element tag นั่นแหละ สำหรับ Attribute Name และ Attribute Value จะเรียกรวมกันว่า Attribute

        ในตัวอย่างก็จะเป็นการกำหนดค่าให้กับ Application โดยกำหนดให้ชื่อของแอปพลิเคชันมีชื่อว่า My App เป็นต้น

        นอกจากการพิมพ์ Tag ปิดแบบนี้แล้วยังสามารถพิมพ์ได้อีกแบบเช่นกัน


        โดยที่ <Tag></Tag> กับ <Tag /> มีผลเหมือนกัน จะใช้แบบไหนก็ได้แล้วแต่ความชอบ

        และ Attribute สามารถกำหนดได้มากกว่าหนึ่งอย่าง ขึ้นอยู่กับว่า Tag นั้นๆมีอะไรให้กำหนดได้บ้าง



        เมื่อรู้โครงสร้างคร่าวๆของ XML แล้ว ก็มาดูตัวอย่างที่อยู่ใน AndroidManifest.xml กันต่อเลยละกัน

<?xml version="1.0" encoding="utf-8"?>

        อันนี้จะเรียกว่า XML Declaration เป็นการประกาศให้รู้ว่าภายในนี้เป็นโค๊ดภาษา XMLโดยมีการกำหนดเวอร์ชัน (XML Version) และรูปแบบของตัวอักษรที่ใช้ (Character Encoding) จากตัวอย่างกำหนดเป็นเวอร์ชัน 1.0 โดยใช้ Encoding เป็น UTF-8

        สำหรับ XML Declaration ไม่ต้องแก้ไขอะไร เวลาสร้างไฟล์ภาษา XML ให้กำหนดไว้ที่หัวโค๊ดแบบนี้ทุกครั้ง


        ต่อมาจะเป็น Tag ที่ชื่อว่า manifest ในตอนที่สร้างโปรเจคมาใหม่ๆจะมีการกำหนดค่าดังนี้

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.simple"
    android:versionCode="1"
    android:versionName="1.0" >
    .
    .
</manifest>

        manifest เป็น Root element tag ของไฟล์ Android Manifest ซึ่งต้องประกาศทุกครั้ง โดยจะประกอบไปด้วย

        xmlns:android เป็นการกำหนด Namespace ของแอนดรอยด์ โดยบังคับให้ต้องกำหนดค่าเป็น http://schemas.android.com/apk/res/android ตลอด
        • package ชื่อแพคเกจของแอปพลิเคชันที่สร้างขึ้นมา ในตัวอย่างเจ้าของบล็อกกำหนดชื่อแพคเกจไว้ตอนสร้างโปรเจคว่า com.example.simple ไว้ ดังนั้นโปรเจคจึงกำหนดค่าตรงนี้ให้โดยอัตโนมัติ
        • android:versionCode เวอร์ชันของแอปพลิเคชันที่จำต้องกำหนดสำหรับตัวระบบแอนดรอยด์ โดยแรกเริ่มนั้นจะเป็นเวอร์ชัน 1 ทุกครั้ง แต่เวลาที่ผู้ที่หลงเข้ามาอ่านนำไปเผยแพร่บน Google Play แล้วจะส่งเวอร์ชันใหม่ขึ้นไปแทนที่จะต้องมาแก้เลขเวอร์ชันที่ตรงนี้ด้วยทุกครั้ง โดยให้บวกเพิ่มทีละ 1 ต่อเวอร์ชันใหม่ในแต่ละครั้ง
        • android:versionName เวอร์ชันของแอปพลิเคชันที่จะแสดงให้ผู้ใช้เห็น จะกำหนดเป็นเวอร์ชันอะไรก็ได้ตามใจชอบ จะเป็น 1.1 หรือ 2.0.12 อะไรแบบนี้ก็ได้ เพราะแสดงให้ผู้ใช้เห็นเท่านั้น ไม่ได้เกี่ยวกับตัวระบบของแอนดรอยด์


        นอกจากนี้ manifest ยังมี Element ซ้อนอยู่ข้างในอีก นั่นก็คือ uses-sdk กับ application

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="18" />

        uses-sdk มีไว้กำหนดเวอร์ชันของอุปกรณ์แอนดรอยด์ที่รองรับกับแอปพลิเคชันนั้นๆ ซึ่งประกอบไปด้วย

        • android:minSdkVersion เวอร์ชันขั้นต่ำของอุปกรณ์แอนดรอยด์ที่จะรองรับ
        • android:targetSdkVersion เวอร์ชันของแอนดรอยด์ที่แอปพลิเคชันนี้สร้างขึ้นมาเป็นหลัก

        จากตัวอย่างจะกำหนดไว้ว่าแอปพลิเคชันนี้รองรับกับอุปกรณ์แอนดรอยด์เวอร์ชันอย่างน้อยคือ 8 โดยสร้างขึ้นมาสำหรับเวอร์ชัน 18 เป็นหลัก

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    .
    .
</application>

        application เป็น Tag ที่เอาไว้กำหนดค่าต่างๆสำหรับแอปพลิเคชัน โดยในเบื้องต้นจะมีดังนี้

        • android:allowBackup กำหนดให้แอปพลิเคชันนี้สามารถ Backup ได้หรือไม่ (มีผลเวลา Backup ข้อมูลและแอปพลิเคชันในเครื่อง)
        • android:icon กำหนดไอคอนที่จะใช้ในแอปพลิเคชันนี้
        • android:label กำหนดชื่อหัว (Title) ของแอปพลิเคชันนี้
        • android:theme กำหนดรูปแบบของธีมที่จะใช้กับแอปพลิเคชันนี้

        ต่อมาก็เป็น Element ที่อยู่ใน application กันต่อ นั่นก็คือ activity

<activity
    android:name="com.example.simple.MainActivity"
    android:label="@string/app_name" >
    .
    .     
</activity>

อันนี้จะเป้นการกำหนดย่อยลงมาในระดับ Activity กันบ้าง โดยจะประกอบไปด้วยดังนี้

        • android:name กำหนดชื่อ Activity ที่จะใช้งาน
        • android:label กำหนดชื่อหัว (Title) เมื่อเข้าสู่หน้า Activity นั้นๆ

        จะเห็นว่าตัวอย่างนี้กำหนด Activity เป็น com.example.simple.MainActivity ทั้งนี้ก็เพราะว่า เจ้าของบล็อกกำหนดชื่อ Activity ไว้เป็น MainActivity.java นั่นเอง ดังนั้นเวลาประกาศ Activity ในนี้ก็ต้องประกาศชื่อเดียวกันกับที่สร้างไว้ ส่วน com.example.simple คือชื่อแพคเกจของแอปพลิเคชัน

        ปกติแล้วการประกาศ Activity สามารถประกาศแค่ ".MainActivity" ก็ได้ แต่การระบุชื่อแพคเกจที่ไฟล์ Activity นั้นอยู่เพิ่มเข้าไปด้วยจะทำให้แม่นยำมากขึ้น เพราะมีกรณีที่สร้างไฟล์ Activity ชื่อเหมือนกันแต่อยู่ในชื่อแพคเกจที่ต่างกัน ทำให้ระบบทำงานผิดพลาดได้


        ต่อมาเป็น Element ที่อยู่ข้างใน activity อีกทีนึง นั่นก็คือ intent-filter

<intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

        intent-filter เป็นการกำหนดรูปแบบหรือประเภทของการ Intent ใน Activity นั้นๆ โดยประกอบไปด้วย

        • <action android:name="android.intent.action.MAIN" /> กำหนดให้ Activity นี้เป็น Activity หลักเมื่อเปิดแอปพลิเคชัน
        • <category android:name="android.intent.category.LAUNCHER" /> เป็นการกำหนดให้ Activity นี้มีไอคอนอยู่ในหน้า Launcher ของอุปกรณ์แอนดรอยด์ (หน้า Homescreen กับ App Drawer)

        จากตรงนี้จะเห็นว่าถ้าสร้าง Activity อื่นขึ้นมาและอยากให้เป็นหน้าหลักแทน Activity นี้ ก็ให้เอา intent-filter ชุดนี้ไปใส่ให้กับ Activity อื่นแทน ส่วน Activity นี้ก็ลบ intent-filter ออกซะ

           จากการอธิบายคร่าวๆทั้งหมดนี้จะเห็นว่าไฟล์ AndroidManifest.xml เป็นการกำหนดค่าการทำงานของแอปพลิเคชันโดยรวม ที่ไม่ได้เจาะจงเข้าไปถึงโค๊ดที่จะต้องเขียน โดยกำหนดคุณสมบัติของแอปพลิเคชันนั้นๆเป็นหลัก