Kullanıcıyı başka bir uygulamaya gönderme

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.

Ekranın alt kısmına yakın bir yerde bir panel görünür. Bu panelde, amacı işleyebilecek farklı uygulamalar listelenir.

Şekil 1. Bir amacı birden fazla uygulama işleyebildiğinde görünen seçim iletişim kutusu örneği.

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

2. Şekil. Seçici iletişim kutusu.

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