Uygulamanız, başka bir uygulama için faydalı olabilecek bir işlem gerçekleştirebiliyorsa eylem taleplerine yanıt vermesi için uygun intent filtresine sahip olmanız gerekir.
Örneğin,
kullanıcının arkadaşlarıyla mesaj veya fotoğraf paylaşabilen bir sosyal uygulama geliştirme,
ACTION_SEND
amacını destekler.
Ardından kullanıcılar bir "paylaşım" işlemi başlattığında başka bir uygulamadaki işlemden sonra, uygulamanız
Şekil 1'de gösterildiği gibi seçici iletişim kutusu (anlam ayrım iletişim kutusu olarak da bilinir).
Diğer uygulamaların etkinliğinizi bu şekilde başlatmasına izin vermek için bir <intent-filter>
eklemeniz gerekir
öğesine karşılık gelen <activity>
öğesine ilişkin manifest dosyanızda bir öğe oluşturun.
Uygulamanız bir cihaza yüklendiğinde sistem, amacınızı belirler
filtreleri ve bilgileri, tüm yüklü uygulamalar tarafından desteklenen dahili bir intent kataloğuna ekler.
Bir uygulama startActivity()
veya startActivityForResult()
aradığında
gizli bir niyetiniz varsa sistem,
isteyebilirsiniz.
Amaç filtresi ekle
Etkinliğinizin işleyebileceği amaçları doğru şekilde tanımlamak için eklediğiniz her intent filtresini oluşturun etkinliğin ve etkinliğin veri türü açısından mümkün olduğunca kabul eder.
Sistem, belirli bir Intent
etkinliğini aşağıdaki durumlarda gönderebilir.
Intent
nesnesinin aşağıdaki ölçütlerini karşılayan bir intent filtresi:
- İşlem
- Yapılacak işlemi adlandıran bir dize. Genellikle platform tarafından belirlenen değerlerden biri,
ACTION_SEND
veyaACTION_VIEW
olarak.Bunu intent filtrenizde
<action>
öğesiyle belirtin. Bu öğede belirttiğiniz değer, API sabitidir. - Veri
- Amaçla ilişkili verilerin açıklaması
Bunu intent filtrenizde
<data>
öğesiyle belirtin. Birini kullanma veya daha fazla özellik bulunuyorsa MIME türünü, URI önekini, URI şeması veya veri türünü gösteren bunların ve diğerlerinin kombinasyonu kabul edilir.Not: Veriler hakkında ayrıntılı bilgi vermeniz gerekmiyorsa
Uri
(ör. etkinliğinizin işleme konduğu durumlar) başka tür bir "ekstra" verisi, URI yerine yalnızcaandroid:mimeType
özelliğini belirtmek için Etkinliğinizin işlediğitext/plain
veyaimage/jpeg
gibi veriler. - Kategori
- Amacı işleyen etkinliği tanımlamak için ek bir yöntem sunar. Bu işlem genellikle birbiriyle ilişkilidir.
başlatıldığı kullanıcı hareketi veya konuma yönlendirmelidir. Birkaç farklı kategori vardır
sistem tarafından desteklense de çoğu nadiren kullanılır. Ancak tüm örtülü niyetler
Varsayılan olarak
CATEGORY_DEFAULT
.Bunu intent filtrenizde
<category>
ile belirtin öğesine dokunun.
Amaç filtrenizde etkinliğinizin hangi ölçütleri kabul ettiğini belirtebilirsiniz.
<intent-filter>
içinde iç içe yerleştirilmiş karşılık gelen XML öğeleriyle her birini tanımlayarak
öğesine dokunun.
Örneğin, veri türü metin veya resim olduğunda ACTION_SEND
amacını işleyen intent filtresine sahip bir etkinliği aşağıda görebilirsiniz:
<activity android:name="ShareActivity"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> <data android:mimeType="image/*"/> </intent-filter> </activity>
İpucu: Seçici iletişim kutusundaki simgenin farklı olmasını istiyorsanız
etkinliğinizin varsayılan simgesinden, <intent-filter>
bölümüne android:icon
ekleyin
öğesine dokunun.
Her gelen intent yalnızca bir işlem ve bir veri türü belirtir. Ancak birden fazla
her birindeki <action>
, <category>
ve <data>
öğelerinin örnekleri
<intent-filter>
Herhangi bir iki eylem ve veri çifti hangi işlemlerin kabul edilebilir olduğunu belirtmek için ayrı intent filtreleri hangi veri türleriyle eşleştirildiğine bakalım.
Örneğin, etkinliğinizin hem ACTION_SEND
hem de ACTION_SENDTO
amaçları için hem metin hem de resimleri işlediğini varsayalım. Bu durumda, iki ayrı
iki işlem için intent filtreleri, çünkü ACTION_SENDTO
niyetinin belirtmek için Uri
verilerini kullanması gerekir
send
veya sendto
URI şemasını kullanarak alıcının adresi. Bu, aşağıdaki örnekte gösterilmektedir:
<activity android:name="ShareActivity"> <!-- Filter for sending text; accepts SENDTO action with sms URI schemes --> <intent-filter> <action android:name="android.intent.action.SENDTO"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="sms" /> <data android:scheme="smsto" /> </intent-filter> <!-- Filter for sending text or images; accepts SEND action and text or image data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/*"/> <data android:mimeType="text/plain"/> </intent-filter> </activity>
Not: Dolaylı niyetleri almak için
Amaç filtresinde CATEGORY_DEFAULT
kategorisi. startActivity()
ve startActivityForResult()
yöntemleri tüm amaçları olduğu gibi ele alır
, CATEGORY_DEFAULT
kategorisini açıkladı. Bunu beyan etmezseniz
hiçbir örtülü intent, etkinliğiniz için çözümlenemez.
ACTION_SEND
gönderme ve alma hakkında daha fazla bilgi
sosyal medya paylaşım davranışlarını gerçekleştiren amaçlarınız için Diğer uygulamalardan basit veriler alma bölümüne bakın.
Ayrıca,
Basit verileri paylaşmak ve
Dosya paylaşma.
Etkinliğinizdeki niyeti ele alın
Etkinliğinizde hangi işleme karar vereceğinize karar vermek için
Başlatmak için kullanılan Intent
.
Etkinliğiniz başladığında, şunu almak için getIntent()
numaralı telefonu arayın:
Etkinliği başlatan Intent
. Bu işlemi,
bu işlemi genellikle erken bir aşamada (örneğin,
onCreate()
veya onStart()
.
Bu, aşağıdaki örnekte gösterilmektedir:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) val data: Uri? = intent?.data // Figure out what to do based on the intent type if (intent?.type?.startsWith("image/") == true) { // Handle intents with image data } else if (intent?.type == "text/plain") { // Handle intents with text } }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get the intent that started this activity Intent intent = getIntent(); Uri data = intent.getData(); // Figure out what to do based on the intent type if (intent.getType().indexOf("image/") != -1) { // Handle intents with image data } else if (intent.getType().equals("text/plain")) { // Handle intents with text } }
Sonuç döndürme
Sizinkini çağıran etkinliğe bir sonuç döndürmek istiyorsanız sonuç kodunu ve Intent
sonucunu belirtmek için setResult()
çağrısı yapın. İşleminiz tamamlandığında ve kullanıcı orijinal sayfaya döndüğünde
etkinliği, finish()
adlı kişiyi arayın ve
etkinliğinizi kapatın ve yok edin. Bu, aşağıdaki örnekte gösterilmektedir:
Kotlin
// Create intent to deliver some kind of result data Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")).also { result -> setResult(Activity.RESULT_OK, result) } finish()
Java
// Create intent to deliver some kind of result data Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")); setResult(Activity.RESULT_OK, result); finish();
Her zaman sonucu içeren bir sonuç kodu belirtmeniz gerekir. Genellikle RESULT_OK
veya RESULT_CANCELED
olur. Ardından
Gerekirse bir Intent
ile ek veri sağlayın.
Not: Sonuç, şu şekilde ayarlanır:
RESULT_CANCELED
varsayılan olarak. Kullanıcı Geri'ye dokunursa,
düğmesini tıklayın. Orijinal etkinlik, işlemi tamamlamadan ve siz sonucu ayarlamadan önce
"iptal edildi" yardımcı olur.
Birkaç sonuç seçeneğinden birini gösteren bir tam sayı döndürmeniz gerekiyorsa
değer 0'dan büyük bir değer olacaktır. Sonuç kodunu bir tam sayı sunmak için kullanırsanız ve
Intent
eklemeniz gerekmez.
setResult()
numaralı telefonu arayabilirsiniz
ve yalnızca bir sonuç kodu iletin:
Kotlin
setResult(RESULT_COLOR_RED) finish()
Java
setResult(RESULT_COLOR_RED); finish();
Bu örnekte, olası birkaç sonuç olabilir. Bu nedenle sonuç kodu, yerel olarak tanımlanmış tam sayı (0'dan büyük). Bu, bir etkinliğe sonuç döndürdüğünüzde işe yarar çünkü sonucu alan etkinlik, kullanıcılara referans verebilir. sabit değer kullanabilirsiniz.
Not: Etkinliğinizin başlatılıp başlatılmadığını kontrol etmenize gerek yoktur.
startActivity()
veya startActivityForResult()
ile. Etkinliğinizi başlatan amaç varsa setResult()
numaralı telefonu aramanız yeterlidir
sonuçlar ortaya çıkabilir. Kaynak etkinliğin adı startActivityForResult()
ise sistem, göndereni teslim eder.
setResult()
için sağladığınız sonuç; aksi takdirde sonuç yoksayılır.