Android'in en önemli özelliklerinden biri, bir uygulamanın gerçekleştirmek istediği "işlem" temelinde,
kullanıcıyı başka bir uygulamaya gönderebilmesidir. Örneğin, uygulamanızda harita üzerinde göstermek istediğiniz bir işletmenin adresi varsa uygulamanızda harita gösteren bir etkinlik oluşturmanız gerekmez. Bunun yerine, Intent
kullanarak adresi görüntülemek için istek oluşturabilirsiniz. Daha sonra Android sistemi, adresi haritada gösterebilen bir uygulama başlatır.
Birinci sınıf olan İlk Uygulamanızı Oluşturma bölümünde açıklandığı gibi, kendi uygulamanızdaki etkinlikler arasında gezinmek için intent kullanmanız gerekir. Bunu genellikle, başlatmak istediğiniz bileşenin tam sınıf adını tanımlayan açık intent ile yaparsınız. Ancak, ayrı bir uygulamanın "harita görüntüleme" gibi bir işlem gerçekleştirmesini istediğinizde dolaylı intent kullanmanız gerekir.
Bu derste, belirli bir eylem için nasıl implicit intent oluşturacağınız ve bu işlemi başka bir uygulamada gerçekleştiren bir etkinlik başlatmak için nasıl kullanılacağı gösterilmektedir. Ayrıca, örtülü amaçlarınız için çalışma zamanı denetimlerini eklemenin neden önemli olduğunu anlamak üzere buraya yerleştirilmiş videoyu da izleyebilirsiniz.
Dolaylı intent oluşturma
Dolaylı amaçlar, başlamak için bileşenin sınıf adını değil, gerçekleştirilecek bir işlemi bildirir. İşlem, bir öğeyi görüntüle, düzenle, gönder veya al gibi yapmak istediğiniz şeyi belirtir.
Amaç işlemlerini verilerle ilişkilendirme
Amaçlar genellikle görüntülemek istediğiniz adres veya göndermek istediğiniz e-posta iletisi gibi işlemle ilişkili verileri de içerir.
Oluşturmak istediğiniz amaca bağlı olarak veriler; Uri
veya diğer veri türlerinden biri olabilir ya da amaç için hiç veriye ihtiyaç duyulmayabilir.
Verileriniz bir Uri
ise işlemi ve verileri tanımlamak için kullanabileceğiniz basit bir Intent()
oluşturucu vardır.
Örneğin, telefon numarasını belirtmek için Uri
verilerini kullanarak telefon araması başlatmak için nasıl bir niyet oluşturacağınız aşağıda açıklanmıştır:
Kotlin
val callIntent: Intent = Uri.parse("tel:5551234").let { number -> Intent(Intent.ACTION_DIAL, number) }
Java
Uri number = Uri.parse("tel:5551234"); Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
Uygulamanız startActivity()
numaralı telefonu arayarak bu amacı çağırdığında, Telefon uygulaması belirtilen telefon numarasına bir arama başlatır.
Aşağıda diğer birkaç niyet, bunların işlemleri ve Uri
veri çiftleri verilmiştir:
Harita görüntüleme
Kotlin
// Map point based on address val mapIntent: Intent = Uri.parse( "geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California" ).let { location -> // Or map point based on latitude/longitude // val location: Uri = Uri.parse("geo:37.422219,-122.08364?z=14") // z param is zoom level Intent(Intent.ACTION_VIEW, location) }
Java
// Map point based on address Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"); // Or map point based on latitude/longitude // Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
Web sayfası görüntüleme
Kotlin
val webIntent: Intent = Uri.parse("https://www.android.com").let { webpage -> Intent(Intent.ACTION_VIEW, webpage) }
Java
Uri webpage = Uri.parse("https://www.android.com"); Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
Amaca ekstra özellikler ekleme
Diğer örtülü amaç türleri, dize gibi farklı veri türleri sağlayan "ekstra" veriler gerektirir. Çeşitli putExtra()
yöntemlerini kullanarak bir veya daha fazla ekstra veri ekleyebilirsiniz.
Varsayılan olarak sistem, bir niyet için gereken uygun MIME türünü, eklenen Uri
verilerine göre belirler. Niyete bir Uri
dahil etmezseniz hedefle ilişkilendirilen veri türünü belirtmek için genellikle setType()
kullanmanız gerekir. MIME türünün ayarlanması, niyeti ne tür etkinliklerin alması gerektiğini belirtir.
İstenen işlemi belirtmek için fazladan veri ekleyen bazı diğer niyetler şunlardır:
Eki olan bir e-posta gönderme
Kotlin
Intent(Intent.ACTION_SEND).apply { // The intent does not have a URI, so declare the "text/plain" MIME type type = "text/plain" putExtra(Intent.EXTRA_EMAIL, arrayOf("jan@example.com")) // recipients putExtra(Intent.EXTRA_SUBJECT, "Email subject") putExtra(Intent.EXTRA_TEXT, "Email message text") putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment")) // You can also attach multiple items by passing an ArrayList of Uris }
Java
Intent emailIntent = new Intent(Intent.ACTION_SEND); // The intent does not have a URI, so declare the "text/plain" MIME type emailIntent.setType(HTTP.PLAIN_TEXT_TYPE); emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jan@example.com"}); // recipients emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject"); emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text"); emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment")); // You can also attach multiple items by passing an ArrayList of Uris
Takvim etkinliği oluşturma
Not: Bu takvim etkinliği amacı, yalnızca API düzeyi 14 ve sonraki sürümlerde desteklenir.
Kotlin
// Event is on January 23, 2021 -- from 7:30 AM to 10:30 AM. Intent(Intent.ACTION_INSERT, Events.CONTENT_URI).apply { val beginTime: Calendar = Calendar.getInstance().apply { set(2021, 0, 23, 7, 30) } val endTime = Calendar.getInstance().apply { set(2021, 0, 23, 10, 30) } putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.timeInMillis) putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.timeInMillis) putExtra(Events.TITLE, "Ninja class") putExtra(Events.EVENT_LOCATION, "Secret dojo") }
Java
// Event is on January 23, 2021 -- from 7:30 AM to 10:30 AM. Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI); Calendar beginTime = Calendar.getInstance(); beginTime.set(2021, 0, 23, 7, 30); Calendar endTime = Calendar.getInstance(); endTime.set(2021, 0, 23, 10, 30); calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis()); calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis()); calendarIntent.putExtra(Events.TITLE, "Ninja class"); calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");
Not: Intent
öğenizi mümkün olduğunca spesifik olacak şekilde tanımlamanız önemlidir. Örneğin, ACTION_VIEW
amacını kullanarak bir resim görüntülemek istiyorsanız image/*
MIME türünü belirtmeniz gerekir. Bu, diğer veri türlerini (harita uygulaması gibi) "görüntüleyebilen" uygulamaların amaç tarafından tetiklenmesini önler.
Amaca yönelik bir etkinlik başlatma
Intent
cihazınızı oluşturup ek bilgileri ayarladıktan sonra sisteme göndermek için startActivity()
numaralı telefonu arayın:
Kotlin
startActivity(intent)
Java
startActivity(intent);
Hiçbir uygulamanın amaç alamadığı durumu ele alın
Birçok niyet, cihazda yüklü başka bir uygulama (ör. telefon, e-posta veya takvim uygulaması) tarafından başarıyla ele alınsa da uygulamanız hiçbir etkinliğin uygulamanızın amacını işleyemediği duruma hazırlanmalıdır. Bir intent çağırdığınızda ActivityNotFoundException
yakalamaya hazır olun. Bu, uygulamanızın amacını işleyebilecek başka bir etkinlik olmadığında gerçekleşir:
Kotlin
try { startActivity(intent) } catch (e: ActivityNotFoundException) { // Define what your app should do if no activity can handle the intent. }
Java
try { startActivity(intent); } catch (ActivityNotFoundException e) { // Define what your app should do if no activity can handle the intent. }
Bu istisnayı yakaladıktan sonra uygulamanızın bir sonraki adımda ne yapması gerektiğine karar verin. Bu sonraki adım, çağırmaya çalıştığınız amacın belirli özelliklerine bağlıdır. Örneğin, amacı işleyebilecek belirli bir uygulama biliyorsanız kullanıcının uygulamayı indirmesi için bir bağlantı sağlayın. Ürününüzü Google Play'de nasıl bağlayacağınız hakkında daha fazla bilgi edinin.
Açıklama amaçlı iletişim kutusu
Sistem, amacı işleyebilecek birden fazla etkinlik tanımlarsa kullanıcının hangi uygulamayı kullanacağını seçmesi için Şekil 1'de gösterildiği gibi bir iletişim kutusu (bazen "anlam ayrımı iletişimi" olarak da adlandırılır) görüntüler. Niyeti işleyen tek bir etkinlik varsa sistem bunu hemen başlatır.
Eksiksiz örnek
Bir haritayı görüntülemek için intent'in nasıl oluşturulacağını, amacı işlemek için bir uygulamanın var olduğunun nasıl doğrulanacağını ve ardından nasıl başlatılacağını gösteren eksiksiz bir örneği burada bulabilirsiniz:
Kotlin
// Build the intent. val location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California") val mapIntent = Intent(Intent.ACTION_VIEW, location) // Try to invoke the intent. try { startActivity(mapIntent) } catch (e: ActivityNotFoundException) { // Define what your app should do if no activity can handle the intent. }
Java
// Build the intent. Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, location); // Try to invoke the intent. try { startActivity(mapIntent); } catch (ActivityNotFoundException e) { // Define what your app should do if no activity can handle the intent. }
Uygulama seçici göster
Intent
cihazınızı startActivity()
cihazına ileterek bir etkinlik başlattığınızda ve amaca yanıt veren birden fazla uygulama olduğunda, kullanıcı varsayılan olarak hangi uygulamayı kullanacağını seçebilir (iletişim kutusunun alt kısmındaki bir onay kutusunu seçerek; Şekil 1'e bakın). Bu, bir web sayfasını açarken (kullanıcılar muhtemelen yalnızca bir web tarayıcısı kullanır) veya fotoğraf çekerken (kullanıcılar muhtemelen tek bir kamerayı tercih ederler) gibi kullanıcının genellikle her seferinde aynı uygulamayı kullanmak istediği işlemlerde faydalıdır.
Bununla birlikte, gerçekleştirilecek işlem birden fazla uygulama tarafından gerçekleştirilebiliyorsa ve kullanıcı her seferinde farklı bir uygulamayı (örneğin, kullanıcıların bir öğeyi paylaşmak için kullanabilecekleri birden fazla uygulamaya sahip olabilen "paylaş" işlemi) farklı uygulamaları tercih ediyorsa, Şekil 2'de gösterildiği gibi açık bir şekilde bir seçici iletişim kutusu göstermeniz gerekir. Seçici iletişim kutusu, kullanıcıyı her seferinde işlem için hangi uygulamanın kullanılacağını seçmeye zorlar (kullanıcı işlem için varsayılan bir uygulama seçemez).
Seçiciyi göstermek için createChooser()
kullanarak bir Intent
oluşturun ve startActivity()
hizmetine iletin. Örneğin:
Kotlin
val intent = Intent(Intent.ACTION_SEND) // Create intent to show chooser val chooser = Intent.createChooser(intent, /* title */ null) // Try to invoke the intent. try { startActivity(chooser) } catch (e: ActivityNotFoundException) { // Define what your app should do if no activity can handle the intent. }
Java
Intent intent = new Intent(Intent.ACTION_SEND); // Create intent to show chooser Intent chooser = Intent.createChooser(intent, /* title */ null); // Try to invoke the intent. try { startActivity(chooser); } catch (ActivityNotFoundException e) { // Define what your app should do if no activity can handle the intent. }
createChooser()
yöntemine iletilen amaca yanıt veren uygulamaların listesini içeren bir iletişim kutusu görüntülenir. İşlem
ACTION_SEND
veya
ACTION_SEND_MULTIPLE
değilse title
parametresi sağlanabilir