Theory
એક screen કદી પૂરતી હોતી નથી
FestConnect Mobile ના events ની યાદી એ એક screen છે. કોઈ event પર tap કરો એટલે એની detail વાળી screen ખૂલવી જોઈએ, જે એ event ની માહિતી બતાવે. એટલે બે screens થઈ, અને app એ બંને વચ્ચે ખસવું પણ પડે અને tap થયેલા event નો data સાથે લઈ પણ જવો પડે.
Android માં દરેક screen એટલે activity, અને એક activity થી બીજી પર જવા માટે તમે intent વાપરો છો: એટલે કે એવો સંદેશો જે કહે છે કે 'આ screen શરૂ કરો'. Intents તમે BCA305-02 માં Java સાથે જોયાં હતાં; અહીં તમે એમને Kotlin માં વાપરો છો. આ પાઠ intents વડે અનેક screens વચ્ચેનું navigation, intent ના બે પ્રકાર, અને એક activity માંથી બીજીમાં data કઈ રીતે મોકલવો એ સમજાવે છે.
Theory
Activities અને intents
Activity એટલે Android app ની એક screen. Intent એટલે કોઈ ક્રિયાનું વર્ણન કરતો સંદેશો, જે મોટે ભાગે 'આ activity શરૂ કરો' એવો હોય છે.
Intent ના બે પ્રકાર છે:
- Explicit intent: ચોક્કસ લક્ષ્ય component નું નામ આપે છે (તમારા app ની કોઈ ખાસ activity). તમારા પોતાના app ની અંદરના navigation માટે વપરાય છે:
Intent(this, DetailActivity::class.java) - Implicit intent: કોઈ app નું નામ આપ્યા વગર ક્રિયાનું વર્ણન કરે છે (જેમ કે 'આ URL જુઓ'), અને એને સંભાળી શકે એવું app શોધવાનું કામ system પર છોડે છે. બીજાં apps ને બોલાવવા માટે વપરાય છે (હવે પછીના પાઠમાં)
Screen ખરેખર ખોલવા માટે startActivity(intent) બોલાવો. આ પાઠ explicit intents પર ધ્યાન આપે છે, એટલે કે તમારી પોતાની screens વચ્ચે ખસવા પર, જે FestConnect Mobile જેવા અનેક screens વાળા app માટે રોજિંદો કિસ્સો છે.
Practical
Explicit intent: list થી detail સુધી, data સાથે
// In the LIST activity: open the DETAIL activity for a tapped event
fun openDetail(eventName: String, seats: Int) {
val intent = Intent(this, DetailActivity::class.java) // EXPLICIT target
intent.putExtra("eventName", eventName) // attach data (extras)
intent.putExtra("seats", seats)
startActivity(intent) // go to the detail screen
}
// In DetailActivity's onCreate: READ the passed data
class DetailActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val name = intent.getStringExtra("eventName") // read extra
val seats = intent.getIntExtra("seats", 0) // default 0
// ... display name and seats
}
}
Theory
Extras વડે data મોકલવો
એક activity માંથી બીજી સુધી data લઈ જવા માટે, intent શરૂ કરતાં પહેલાં એની સાથે extras જોડો:
intent.putExtra("eventName", eventName)
મેળવનારી activity એમને પોતાના intent માંથી વાંચે છે:
val name = intent.getStringExtra("eventName")
દરેક extra એ key અને value ની જોડ છે (putExtra(key, value), અને પ્રકાર પ્રમાણે getStringExtra(key), getIntExtra(key, default) વગેરે). એટલે યાદી વાળી activity tap થયેલા event નું name અને seats intent માં બાંધે છે, અને detail વાળી activity એમને છોડે છે: આમ data intent દ્વારા એક screen થી બીજી screen સુધી વહે છે. પછીની screen ને માહિતી સોંપવાની આ જ Android ની પ્રમાણભૂત રીત છે, અને FestConnect Mobile નું detail પાનું કયો event બતાવવો એ બરાબર આ જ રીતે જાણે છે.
Quiz
તમારે તમારા પોતાના app ની કોઈ ચોક્કસ screen (DetailActivity) ખોલવી છે અને એને event નું name મોકલવું છે. કયો intent નો પ્રકાર અને કઈ રીત?
- Action ના string વાળું implicit intent
- DetailActivity નું નામ આપતું explicit intent, જેમાં data putExtra વડે જોડાય અને getStringExtra વડે વંચાય
- કોઈ intent ની જરૂર જ નથી; સીધી activity ની method બોલાવો
- Broadcast intent
Show the answer
DetailActivity નું નામ આપતું explicit intent, જેમાં data putExtra વડે જોડાય અને getStringExtra વડે વંચાય
તમારા પોતાના app ની કોઈ ચોક્કસ activity ખોલવા માટે એવું explicit intent વાપરો જે લક્ષ્યનું નામ આપે (Intent(this, DetailActivity::class.java)), અને startActivity પહેલાં putExtra વડે extras જોડીને data મોકલો; મેળવનારી activity એમને getStringExtra કે getIntExtra વડે વાંચે છે. વિકલ્પ A (implicit intent) બીજાં apps ને ક્રિયા દ્વારા બોલાવવા માટે છે (જેમ કે URL ખોલવો), તમારી પોતાની નામ આપેલી screen પર જવા માટે નહીં. વિકલ્પ C ખોટો છે: activity બતાવવા માટે તમે સીધી એની method બોલાવી ન શકો; activities intents અને Android system દ્વારા જ શરૂ થાય છે. વિકલ્પ D (broadcast) એ system આખામાં ફેલાતા સંદેશા માટેની જુદી વ્યવસ્થા છે, screen ના navigation માટે નહીં. Explicit intent સાથે extras એ app ની અંદર data સહિતના navigation ની પ્રમાણભૂત રીત છે.
Think first
Explicit કે implicit: બે જુદાં કામ
FestConnect Mobile ને (a) પોતાની DetailActivity ખોલવી છે, અને (b) fest ની website browser માં ખોલવી છે. દરેક માટે intent નો કયો પ્રકાર, અને શા માટે? વિચારીને પછી tap કરો.
Show the answer
(a) તમારી પોતાની DetailActivity ખોલવા માટે explicit intent વપરાય છે: તમને બરાબર ખબર છે કે કયું component શરૂ કરવું છે (DetailActivity), એટલે તમે સીધું એનું નામ આપો છો. Explicit intents તમારા app ની અંદરના navigation માટે છે. (b) Fest ની website browser માં ખોલવા માટે implicit intent વપરાય છે: તમે કોઈ ચોક્કસ browser નું નામ આપતા નથી; એને બદલે તમે ક્રિયાનું વર્ણન કરો છો ('આ URL જુઓ') અને એને સંભાળી શકે એવું app શોધવાનું Android system પર છોડો છો (વપરાશકર્તા પાસે જે browser હોય તે). Implicit intents બીજાં apps ને એમના નામથી નહીં પણ એમની ક્ષમતાથી બોલાવવા માટે છે. નિયમ આ રહ્યો: લક્ષ્ય બરાબર ખબર હોય ત્યારે explicit (તમારી પોતાની screens), અને કોઈ ક્રિયા માટે app શોધવાનું system પર છોડવું હોય ત્યારે implicit (URL ખોલવો, વહેંચવું, ફોટો પાડવો). હવે પછીનો પાઠ implicit intents ને વિગતે જુએ છે (web URLs અને વહેંચવું).
Watch out
Intent ની જાળો
Explicit અને implicit ની ગૂંચવણ: explicit component નું નામ આપે છે (તમારી screens); implicit ક્રિયાનું વર્ણન કરે છે (બીજાં apps).
ખોટા પ્રકારનું extra વાંચવું: String માટે getStringExtra, Int માટે getIntExtra; મેળ ન ખાય તો null કે default પાછું આવે.
startActivity ભૂલી જવું: ફક્ત intent બનાવવાથી કશું થતું નથી, જ્યાં સુધી તમે એને શરૂ ન કરો.
નોંધ્યા વગરની activity: activities manifest માં જાહેર કરેલી હોવી જોઈએ, નહીં તો શરૂ કરતાં app તૂટે છે.
Extras દ્વારા મોટો કે ગૂંચવણભર્યો data મોકલવો: extras નાના data માટે બંધબેસે છે; મોટા objects માટે બીજી રીતો જોઈએ (વહેંચાયેલો સંગ્રહ, કે ફરી લાવવા માટે ids).
Theory
પોતાની screens પતી; હવે બીજાં apps
FestConnect Mobile હવે explicit intents વડે પોતાની screens વચ્ચે ફરી શકે છે અને સાથે data પણ લઈ જઈ શકે છે. હવે પછીનો પાઠ તમારા app ની બહાર પહોંચવા માટે implicit intents વાપરે છે: fest ની website browser માં ખોલવી, અને event ને WhatsApp કે બીજાં apps માં વહેંચવો. Implicit intents તમારા app ને આખા device સાથે સહકાર કરવા દે છે, જે સારાં Android apps ની ઓળખ છે. પછી SQLite app ને કાયમી સંગ્રહ આપે છે, અને location તથા camera device ની શક્તિઓ ઉમેરે છે.
Summary
Key takeaways
- Activity એટલે એક screen; intent એટલે activity શરૂ કરવાનો (કે કોઈ ક્રિયા કરવાનો) સંદેશો.
- Explicit intent: ચોક્કસ લક્ષ્ય component નું નામ આપે છે (Intent(this, DetailActivity::class.java)): તમારા app ની અંદરના navigation માટે.
- Implicit intent: ક્રિયાનું વર્ણન કરે છે અને એને સંભાળનારું app શોધવાનું system પર છોડે છે: બીજાં apps બોલાવવા માટે (હવે પછીનો પાઠ).
- startActivity(intent) screen ને શરૂ કરે છે.
- Extras વડે data મોકલો: શરૂ કરતાં પહેલાં intent.putExtra("key", value); અને intent.getStringExtra("key") કે getIntExtra(key, default) વડે વાંચો.
- Data એક activity માંથી બીજી સુધી intent નાં extras દ્વારા વહે છે.
- યાદ રાખવાની કડી: explicit screen નું નામ આપે, implicit ક્રિયાનું વર્ણન કરે, અને putExtra તથા getExtra data લઈ જાય.