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

Android'in en önemli özelliklerinden biri, uygulamanın kullanıcıyı başka bir uygulamaya gönderebilmesidir. bir "işleme" dayalı olarak neye benzediğini gösterir. Örneğin, uygulamanız haritada göstermek istediğiniz bir işletmenin adresine sahipse, uygulamanızda harita gösteren bir etkinlik. Bunun yerine, adresi görüntülemek için istek oluşturabilirsiniz Intent kullanarak. Android sistemi daha sonra, adresini haritada görebilirsiniz.

İlk sınıfta açıklandığı gibi, İlk Uygulamanız ise kendi uygulamanızdaki etkinlikler arasında gezinmek için intent'leri kullanmanız gerekir. Siz bunu genellikle, JavaScript'in tam sınıf adını tanımlayan açık bir niyet ile yapar. bileşeni seçin. Ancak ayrı bir uygulamanın, başka bir uygulama tarafından gerçekleştirilen bir işlem gerçekleştirmesini "harita görüntüleme" dolaylı intent kullanmanız gerekir.

Bu derste, belirli bir eylem için nasıl örtülü niyet oluşturacağınız ve bunu nasıl kullanacağınız gösterilmektedir Başka bir uygulamada işlemi gerçekleştiren bir etkinlik başlatmak için Buraya yerleştirilmiş videoya da bakın Örtülü niyetleriniz için çalışma zamanı denetimlerini eklemenin neden önemli olduğunu öğrenin.

Dolaylı intent oluşturma

Dolaylı niyetler, başlatılacak bileşenin sınıf adını belirtmez, bunun yerine bir bir eylemdir. İşlem, yapmak istediğiniz şeyi belirtir. Örneğin, görüntüleme, düzenle, gönder veya al.

Amaç işlemlerini verilerle ilişkilendirme

Amaçlar genellikle ilişkili verileri de içerir. e-posta iletisiyle (ör. görüntülemek istediğiniz adres veya göndermek istediğiniz e-posta iletisi) ekleyebilirsiniz. Oluşturmak istediğiniz amaca bağlı olarak veriler bir Uri olabilir. ya da intent için hiç veriye ihtiyaç duymayabilir.

Verileriniz bir Uri ise işlemi tanımlamak veIntent() verileri.

Örneğin, telefon numarasını belirtmek için Uri verilerini kullanarak telefon araması başlatma niyetinin nasıl oluşturulacağı 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ı gerçekleştirdiğinde, Telefon uygulaması belirtilen telefon numarasına çağrı başlatır.

Burada diğer birkaç intent, bunların işlemi ve Uri verileri yer almaktadır çiftler:

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ını 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);

Niyete ekstralar ekleme

Diğer örtülü niyet türleri için "ekstra" farklı veri türlerini, kullanabilirsiniz. Çeşitli putExtra() yöntemlerini kullanarak bir veya daha fazla ekstra veri ekleyebilirsiniz.

Varsayılan olarak sistem, Uri verileri dahil edilir. Uri satın alma amacı taşıyorsanız, türü belirtmek için genellikle setType() amacıyla ilişkili verileri içerebilir. MIME türünün ayarlanması, istenen sonuca ulaşacaklarını düşünmelisiniz.

İstenen işlemi belirtmek için ekstra veri ekleyen bazı diğer niyetler şunlardır:

Ek içeren 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 niyeti yalnızca API ile desteklenir 14. seviye ve üstü olmalıdır.

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 özelliğini mümkün olduğunca ayrıntılı şekilde tanımlamanız önemlidir. Örneğin, Yeşil Ofis web sitesinde bir ACTION_VIEW niyetini kullanarak şunun MIME türü belirtmeniz gerekir: image/*. Bu işlem, "görüntüleyebilen" uygulamaları engeller diğer veri türlerinin (ör. harita uygulaması) tarafından tetiklenemez.

Amaca yönelik bir etkinlik başlatın

Intent oluşturup ek bilgileri belirledikten sonra sisteme göndermek için startActivity() numaralı telefonu arayın:

Kotlin

startActivity(intent)

Java

startActivity(intent);

Hiçbir uygulamanın intent alamadığı durumu ele alma

Birçok intent, yüklü başka bir uygulama tarafından başarıyla işlenmesine rağmen cihaz üzerinde (ör. telefon, e-posta veya takvim uygulaması) uygulamanız gereken hiçbir etkinliğin uygulamanızın amacını yerine getiremeyeceği durumlarda kullanın. İstediğiniz zaman bir niyeti çağırın, bir çağrıyı yakalamaya ActivityNotFoundException Uygulamanızın amacını gerçekleştirebilecek başka bir etkinlik yoksa 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ımına karar verin. Bu sonraki adımı, ulaşmayı denediğiniz amacın belirli özelliklerine bağlıdır. kullanır. Örneğin, bu amacı işleyebilecek belirli bir uygulama biliyorsanız kullanıcıya uygulamayı indirebileceği bir bağlantı sağlamalıdır. Şu işlemler hakkında daha fazla bilgi edinin: Google Play'de ürününüze yönlendiren bir bağlantı oluşturun.

Açıklama amaçlı iletişim kutusu

Sistem, amacı gerçekleştirebilecek birden fazla etkinlik tespit ederse iletişim kutusu ("belirtme" iletişim kutusu olarak da anılır) kullanıcının hangi uygulamanın kullanılacağını seçmesini sağlayın (Şekil 1'de gösterildiği gibi). Yalnızca bir sistem bunu hemen başlatır.

Bir panel görüntülenir
  ekranın alt kısmına yakın bir yere dokunun. Bu panelde, hangi uygulamaları
  düşünmelisiniz.

Şekil 1. Seçim örneği bir niyeti birden fazla uygulama işleyebiliyorsa görüntülenen iletişim kutusu.

Tam örnek

Aşağıda, harita görüntüleme niyetinin nasıl oluşturulduğunu gösteren eksiksiz bir örnek verilmiştir. Bir oluşturmak için uygulamanız gerekir:

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çiciyi gösterme

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

Intent cihazınızı startActivity() hizmetine ileterek bir etkinlik başlattığınızda, yanıt veren birden fazla uygulama olduğuna dikkat edin kullanıcı varsayılan olarak kullanılacak uygulamayı seçebilir (alttaki bir onay kutusunu işaretleyerek iletişim kutusunu açar. Şekil 1'e bakın). Bu, kullanıcının belirli bir işlem için Genellikle her zaman aynı uygulamayı kullanmak ister. Örneğin, bir web sayfasını açarken (kullanıcılar büyük ihtimalle yalnızca bir web tarayıcısı kullanır) veya fotoğraf çekerken (kullanıcılar tek bir kamerayı tercih ederler).

Ancak, yapılacak işlem birden fazla uygulama tarafından işlenecekse ve kullanıcı her seferinde farklı bir uygulamayı tercih etme (örneğin, "paylaşma") Bu işlem, kullanıcıların birden fazla bir öğeyi paylaşabilecekleri uygulamalar (açık olarak bir seçici iletişim kutusu göstermeniz gerekir) Şekil 2'de gösterildiği gibidir. Seçici iletişim kutusu kullanıcıyı her seferinde işlem için hangi uygulamayı kullanacağını seçmeye zorlar (kullanıcı bir seçim varsayılan uygulama olur).

Seçiciyi göstermek için createChooser() kullanarak bir Intent oluşturun ve startActivity() adlı kullanıcıya iletin. Örnek:

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.
}

İletilen amaca yanıt veren uygulamaların listesini içeren bir iletişim kutusu gösterilir. createChooser() yöntemine. title parametresi işlem ACTION_SEND veya ACTION_SEND_MULTIPLE değilse sağlanır