Theory
તમારા app ની બહાર પહોંચવું
FestConnect Mobile ને બે એવી વસ્તુ જોઈએ છે જે એ એકલું કરી શકતું નથી: fest ની website ખોલવી (એ માટે browser જોઈએ) અને વપરાશકર્તાઓને WhatsApp કે email માં event વહેંચવા દેવો (એ માટે એ apps જોઈએ). તમારા app માં browser કે messaging નું client નથી, અને હોવું પણ ન જોઈએ.
એને બદલે Android તમારા app ને system ને પૂછવા દે છે: 'કોઈ આ URL ખોલો' કે 'કોઈ આ લખાણ વહેંચો', અને system એવું app શોધી કાઢે છે જે એ કરી શકે. આ જ implicit intent છે, અને apps આ રીતે જ સહકાર કરે છે. આ પાઠ URLs ખોલવા અને લખાણ વહેંચવું, એટલે કે અભ્યાસક્રમે જણાવેલી implicit-intent ની બે રીતો શીખવે છે, જે FestConnect Mobile ને આખા device સાથે જોડી આપે છે.
Theory
Implicit intents: ક્રિયાનું વર્ણન
Implicit intent કોઈ ચોક્કસ app નું નામ આપ્યા વગર ક્રિયા (અને જરૂર પડ્યે data) જણાવે છે. Android એને સંભાળી શકે એવું app શોધી કાઢે છે.
System ને કઈ રીતે ખબર પડે કે કયાં apps એ ક્રિયા સંભાળી શકે? Apps પોતાના manifest માં intent filters જાહેર કરે છે, જેમાં એ કઈ ક્રિયાઓ સંભાળી શકે એ જણાવે છે (browser જાહેર કરે છે કે એ web URLs માટે ACTION_VIEW સંભાળી શકે છે; WhatsApp જાહેર કરે છે કે એ લખાણ માટે ACTION_SEND સંભાળે છે). તમે implicit intent છોડો ત્યારે Android એને આ filters સામે મેળવે છે અને મળતાં આવતાં apps રજૂ કરે છે.
એટલે તમારું app ફક્ત ઇરાદો જણાવે છે ('આ જુઓ', 'આ મોકલો') અને system એને એ કરી શકે એવા app સાથે જોડી આપે છે, અને તમારા app ને ખબર પણ હોતી નથી કે વપરાશકર્તાએ કયાં apps રાખ્યાં છે, કે એની પરવા પણ કરવી પડતી નથી. આ ઢીલું જોડાણ એ Android ની રચનાની પાયાની તાકાત છે.
Practical
URL ખોલવો, અને event વહેંચવો
// OPEN A URL: ACTION_VIEW with a web Uri -> opens in a browser
fun openFestWebsite() {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://fest.example"))
startActivity(intent) // system finds a browser to handle it
}
// SHARE text to any app (WhatsApp, email, etc.)
fun shareEvent(name: String) {
val intent = Intent(Intent.ACTION_SEND).apply {
type = "text/plain"
putExtra(Intent.EXTRA_TEXT, "Join me for $name at TechnoUtsav!")
}
// createChooser shows the app picker ("Share via ...")
startActivity(Intent.createChooser(intent, "Share event"))
}
Theory
ACTION_VIEW, ACTION_SEND અને chooser
અભ્યાસક્રમે જણાવેલી બે રીતો આ રહી:
- URL ખોલવો:
Intent(Intent.ACTION_VIEW, Uri.parse(url))અને પછીstartActivity. Web ના URI સાથેનું ACTION_VIEW system ને એ જોવાનું કહે છે, અને browser (કે મળતું આવતું app) એને ખોલે છે - લખાણ વહેંચવું:
Intent(Intent.ACTION_SEND)સાથેtype(લખાણ માટે"text/plain", ચિત્ર માટે"image/*") અનેEXTRA_TEXTમાં લખાણ (કે media નું URI). એનાથી એ પ્રકારને સ્વીકારતા કોઈ પણ app માં વહેંચી શકાય
વહેંચવા માટે intent ને Intent.createChooser(intent, "Share event") માં લપેટો, જેથી 'Share via...' વાળું ચૂંટણી પાનું દેખાય અને વપરાશકર્તા કયું app વાપરવું એ પસંદ કરી શકે. Chooser વગર Android કદાચ મૂળ ગોઠવેલું app જ પકડી લે. આ chooser એ જ જાણીતું share sheet છે જે તમે Android નાં apps માં જુઓ છો: તમારું app એને એક જ implicit intent વડે ખોલે છે.
Quiz
FestConnect Mobile વપરાશકર્તાઓને એમને ગમતા કોઈ પણ messaging app માં event વહેંચવા દેવા માગે છે. કઈ રીત વાપરવી?
- WhatsApp શોધીને explicit intent વડે એને સીધું ખોલવું
- Implicit intent વાપરવું (EXTRA_TEXT સાથે ACTION_SEND), અને જરૂર પડ્યે એને createChooser માં લપેટવું, જેથી system બધાં સક્ષમ apps રજૂ કરે
- FestConnect ની અંદર જ messaging ની સગવડ બનાવવી
- App માંથી વહેંચવું શક્ય જ નથી
Show the answer
Implicit intent વાપરવું (EXTRA_TEXT સાથે ACTION_SEND), અને જરૂર પડ્યે એને createChooser માં લપેટવું, જેથી system બધાં સક્ષમ apps રજૂ કરે
વપરાશકર્તાને જે app ગમે એમાં વહેંચવું, એ બરાબર implicit intent નું જ કામ છે: EXTRA_TEXT માં લખાણ (અને type) સાથેનું ACTION_SEND, જેને system વહેંચી શકતાં દરેક app ને રજૂ કરે છે, અને createChooser ચૂંટણી પાનું બતાવે છે જેથી વપરાશકર્તા એક પસંદ કરે. વિકલ્પ A (સીધું WhatsApp ને નિશાન બનાવવું) નાજુક પણ છે અને ખોટા ભાવવાળો પણ: એ માની લે છે કે WhatsApp હાજર જ છે અને વપરાશકર્તાનાં બીજાં apps ને અવગણે છે; implicit intents કોઈ ચોક્કસ app નું નામ આપવાનું ટાળે છે. વિકલ્પ C નકામી રીતે messaging ફરી શોધે છે, જ્યારે તમારા app એ હાલનાં apps સાથે સહકાર કરવો જોઈએ, એમની નકલ નહીં. વિકલ્પ D ખોટો છે. રચનાનો બોધ આ છે: કોઈ ચોક્કસ app ને નહીં પણ ક્ષમતાને (વહેંચવું, જોવું, ફોન કરવો) બોલાવવી હોય, તો implicit intent વાપરો અને એને સંભાળનારા સાથે જોડવાનું કામ system પર છોડો.
Think first
સીધું WhatsApp ને જ કેમ ન પકડવું?
વહેંચવા માટે ખાસ WhatsApp ખોલી દેવું વધુ સહેલું લાગે. તો implicit intent વાળી, એટલે કે વપરાશકર્તાને પસંદ કરવા દેતી રીત કેમ વધુ સારી છે? વિચારીને પછી tap કરો.
Show the answer
એનાં અનેક કારણો છે. (1) બધા પાસે WhatsApp હોતું નથી; વપરાશકર્તાને Telegram, email, SMS કે Instagram વધુ ગમતું હોઈ શકે, અને ફક્ત WhatsApp ને પકડવાથી કાં તો કામ થાય જ નહીં, કાં તો એ વપરાશકર્તાઓ બાકાત રહી જાય. (2) Implicit intent અને chooser વાળી રીત વપરાશકર્તાની પસંદગીને માન આપે છે: share sheet એનાં બધાં સક્ષમ apps બતાવે છે અને એ પોતે પસંદ કરે છે. (3) એ મજબૂત છે: તમારું app કોઈ ચોક્કસ app હાજર હોવા પર કે એની અંદરની વિગતો પર આધાર રાખતું નથી (એ વિગતો બદલાય તો તમારું કામ તૂટે). (4) એ Android ના ઢીલા જોડાણવાળા રચનાસિદ્ધાંતને અનુસરે છે: apps પોતાની ક્ષમતાઓ (intent filters દ્વારા) જાહેર કરે છે અને system એમને જોડી આપે છે, એટલે તમારા app ને જાણ પણ ન હોય એવું કોઈ પણ સક્ષમ app કામ કરી જાય છે. એક જ app ને પકડવું નાજુક, ધારણાભર્યું અને મર્યાદિત છે; ક્રિયાનું વર્ણન કરવું અને એને સંભાળનારાં apps રજૂ કરવાનું system પર છોડવું એ લવચીક, આદરભર્યું અને ભવિષ્યમાં પણ ટકે એવું છે. App ને નહીં, ક્ષમતાને બોલાવો.
Watch out
Implicit intent ની જાળો
કોઈ ચોક્કસ app ને જ પકડવું: એને બદલે ક્રિયાનું વર્ણન કરો અને એને સંભાળનારાં apps રજૂ કરવાનું system પર છોડો.
કોઈ સંભાળનાર જ ન હોય: જો કોઈ app એ implicit intent સંભાળી ન શકે, તો startActivity app ને તોડી શકે છે; resolveActivity વડે તપાસો કે exception સંભાળો.
ACTION_SEND પર ખોટો type: લખાણ પ્રમાણે type ને text/plain, image/* વગેરે ગોઠવો, નહીં તો apps એને સ્વીકારશે નહીં.
createChooser ભૂલી જવું: એના વગર Android કદાચ વપરાશકર્તાને પસંદ કરવા દેવાને બદલે મૂળ ગોઠવેલું app જ ખોલી દે.
Browser હશે જ એવું માની લેવું: સામાન્ય રીતે વાંધો આવતો નથી, પણ મજબૂત apps તો કોઈ સંભાળનાર ન હોય એ કિસ્સો પણ સંભાળે છે.
Theory
App સહકાર કરે છે; હવે એ યાદ પણ રાખશે
FestConnect Mobile હવે URLs ખોલી શકે છે અને events વહેંચી શકે છે, એટલે કે device નાં બીજાં apps સાથે જોડાઈ શકે છે. પણ બંધ થાય એટલે એ હજી પોતાનો data ભૂલી જાય છે. હવે પછીનો પાઠ એને SQLite (Android નું અંદરથી મળતું database) વડે કાયમી સંગ્રહ આપે છે, પૂરા CRUD સાથે, જેથી registrations એક સત્રથી બીજા સત્ર સુધી ટકે; આ તો તમે BCA205, BCA303 અને BCA504 માં બનાવેલા databases નો જ mobile પરનો પડઘો છે. પછી location અને camera device ની ક્ષમતાઓ ઉમેરે છે.
Summary
Key takeaways
- Implicit intent કોઈ app નું નામ આપ્યા વગર ક્રિયા (અને જરૂર પડ્યે data) જણાવે છે; system એને સંભાળનારને શોધી કાઢે છે.
- Apps પોતાના manifest માં intent filters દ્વારા જાહેર કરે છે કે એ શું સંભાળી શકે છે; Android તમારા intent ને એમની સાથે મેળવે છે.
- URL ખોલવો: Intent(Intent.ACTION_VIEW, Uri.parse(url)) અને startActivity, જે browser માં ખૂલે છે.
- લખાણ વહેંચવું: Intent(Intent.ACTION_SEND) સાથે type અને EXTRA_TEXT (કે media નું URI).
- વહેંચવાના intent ને Intent.createChooser(intent, title) માં લપેટો, જેથી 'Share via...' વાળું ચૂંટણી પાનું દેખાય.
- કોઈ ચોક્કસ app ને નહીં પણ ક્ષમતાને (વહેંચવું, જોવું) બોલાવવા implicit intents વાપરો: એ લવચીક છે અને વપરાશકર્તાને માન આપે છે.
- યાદ રાખવાની કડી: implicit intent ક્રિયાનું વર્ણન કરે, system apps રજૂ કરે, અને createChooser વપરાશકર્તાને પસંદ કરવા દે.