Theory
બે files જે તમે લખી નથી, પણ સમજવી જ પડે
તમે FestConnect બનાવ્યું ત્યારે Android Studio એ બે files સર્જી જે ચૂપચાપ app ને બાંધી રાખે છે. એક operating system ને કહે છે કે તમારી app શું છે અને એ શું કરી શકે. બીજી તમારા Java ના code ને તમે રચેલાં XML નાં resources શોધવા દે છે.
એ છે AndroidManifest.xml અને R.java. તમે પહેલીને વારંવાર સુધારો છો અને બીજીને ક્યારેય નહીં, પણ બંને પરીક્ષાનો મુખ્ય ખોરાક છે અને બંને 'Activity not found' અને 'cannot resolve R' જેવી ભૂલો સમજાવે છે.
Theory
પાસપોર્ટ અને index
Manifest એ તમારી app નો પાસપોર્ટ છે: એ એની ઓળખ જણાવે છે (package નું નામ), એ ક્યાં જઈ શકે એની lists આપે છે (પરવાનગીઓ), અને એના પડદાનાં નામ આપે છે જેથી OS એમને ઓળખે. R.java એ પુસ્તકના પાછલા ભાગની index છે: દરેક ચિત્ર, layout, અને label ને પાનાનો આંકડો (integer id) મળે છે જેથી કોઈ પણ પ્રકરણ (તમારો Java) નામથી સીધું ત્યાં કૂદી શકે.
Theory
દરેક શું જાહેર કરે છે
AndroidManifest.xml (જરૂરી, app ના મૂળમાં) જાહેર કરે છે:
- package નું નામ,
- દરેક Activity (જાહેર ન કરાયેલી Activity શરૂ થઈ શકતી નથી),
- શરૂ થતી Activity (જે પહેલી ખૂલે છે),
- app ને જોઈતી પરવાનગીઓ (
uses-permission, દા.ત. INTERNET), - app નું નિશાન, theme, અને SDK નાં સ્તર.
R.java એ આપોઆપ સર્જાય છે (એને ક્યારેય સુધારો નહીં). એ દરેક resource ને integer id આપે છે, જેથી Java R.layout.activity_main, R.id.title, R.string.welcome કહી શકે. એ XML નાં resources થી code સુધીનો પુલ છે.
Practical
AndroidManifest.xml (કાપેલું)
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.college.festconnect">
<uses-permission android:name="android.permission.INTERNET" />
<application android:icon="@mipmap/ic_launcher" android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>Think first
App પહેલાં કઈ ખોલે છે?
FestConnect માં MainActivity છે જે app નું નિશાન દબાવતાં પહેલો દેખાતો પડદો હોવો જોઈએ. કઈ file એને શરૂ થતી તરીકે ચીંધે છે, અને કયો ચોક્કસ ટુકડો એને ચીંધે છે?
Show the answer
AndroidManifest.xml, અને એ પણ એ Activity ની અંદરના <intent-filter> દ્વારા જેમાં MAIN ની ક્રિયા અને LAUNCHER ની શ્રેણી હોય. બંને સાથે મળીને Android ને કહે છે કે 'આ પ્રવેશની Activity છે; એનું નિશાન launcher માં મૂકો અને અહીંથી શરૂ કરો'. એ intent-filter કાઢી નાખો અને app ને શરૂ કરવાનું નિશાન જ નહીં રહે. શરૂ કરવામાં R.java સંડોવાયેલું નથી; એ ફક્ત resources ને ids સાથે મેળવે છે. App ની રચના અને પ્રવેશબિંદુ manifest ના હાથમાં છે.
Quiz
તમે બીજો પડદો, SettingsActivity, ઉમેરો છો, એનું Java અને layout લખો છો, પણ એને ખોલતાં app 'Activity not found' સાથે તૂટી પડે છે. તમે મોટે ભાગે શું ભૂલી ગયા?
- AndroidManifest.xml માં <activity android:name=".SettingsActivity"> જાહેર કરવાનું
- નવી Activity હાથે ઉમેરવા R.java સુધારવાનું
- App નું package નું નામ બદલવાનું
- AndroidManifest.xml કાઢી નાખવાનું
Show the answer
AndroidManifest.xml માં <activity android:name=".SettingsActivity"> જાહેર કરવાનું
દરેક Activity manifest માં જાહેર થવી જ જોઈએ; જાહેર ન થયેલી શરૂ થઈ શકતી નથી, અને 'Activity not found' આપે છે (A). તમે R.java ને ક્યારેય હાથે સુધારતા નથી, એ સર્જાય છે (B). Package નું નામ બદલવાથી (C) બીજું ઘણું તૂટે અને એ unrelated છે. Manifest કાઢી નાખવાથી (D) app સાવ બંધ થઈ જાય. નિયમ: નવી Activity, manifest માં નોંધ ઉમેરો.
Watch out
Manifest અને R ના ફાંદા
1. જાહેર ન કરાયેલી Activity: દરેક પડદાની <activity> ની નોંધ હોવી જ જોઈએ, નહીં તો એને શરૂ કરતાં app તૂટે છે.
2. R.java સુધારવું: એ દરેક build પર ફરી સર્જાય છે, એટલે હાથે કરેલા સુધારા ગાયબ થાય છે અને ભૂલો સર્જે છે. જો 'R cannot be resolved' આવે, તો ઉકેલ સામાન્ય રીતે તૂટેલું resource (ખરાબ XML) કે નિષ્ફળ build હોય છે, R સુધારવાનું નહીં.
3. ખૂટતી પરવાનગી: internet કે camera જેવાં લક્ષણોને manifest માં uses-permission જોઈએ, નહીં તો એ ચૂપચાપ નિષ્ફળ જાય છે.
Theory
આગળ: XML પોતાની શરતે
તમે હવે XML ને ત્રણ વાર જોયું છે: layout, manifest, અને resource ની files, બધું ખૂણિયા કૌંસવાળું markup. Unit 3 પાછળ ખસીને XML પોતે શીખવે છે: એને well-formed શું બનાવે છે, એની declaration અને prolog, એક જ મૂળનો નિયમ, અને case sensitivity. Android નાં layouts અને manifest બધું XML હોવાથી, એને પાકું કરવાથી તમારા project ની દરેક file વાંચી શકાય એવી બની જાય છે.
Summary
Key takeaways
- AndroidManifest.xml એ app નો પાસપોર્ટ છે: એ package, દરેક Activity, શરૂ થતો પડદો, પરવાનગીઓ, અને SDK નાં સ્તર જાહેર કરે છે.
- શરૂ થતી Activity ને MAIN ની ક્રિયા અને LAUNCHER ની શ્રેણીવાળા intent-filter થી ચીંધાય છે.
- Manifest માં જાહેર ન થયેલી Activity શરૂ થઈ શકતી નથી ('Activity not found' નું સામાન્ય કારણ).
- R.java આપોઆપ સર્જાય છે (એને ક્યારેય સુધારો નહીં) અને દરેક resource ને integer id સાથે મેળવે છે: R.layout, R.id, R.string.
- પરવાનગીઓ (internet, camera) uses-permission થી જાહેર કરવી પડે, નહીં તો લક્ષણ નિષ્ફળ જાય છે.
- Memory hook: manifest = પાસપોર્ટ, R.java = પુસ્તકના પાછલા ભાગની index.