🏹 Implicit intents

🎯 Hangi Amaçla Kullanılır

İşletim sistemi tarafından yönetilen isteklerdir

  • Hangi uygulamanın çalıştırılacağına işletim sistemi karar verir

  • Diğer uygulamalara istekte bulunmayı sağlar

  • ✅ App Chooser adı verilen yapı ile kullanıcıya seçim hakkı tanınır

✅ App Chooser

✨ Implicit Intent Oluşturma

  • Intent oluşturmadan önce isteği karşılayabilecek Activity var mı kontrol edilmelidir.

  • İsteklerini sağlayacak Activity olmazsa uygulama kapanır

// Implicit intent oluşturma
Intent sendIntent= new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType("text/plain");
// Intent başlığını ayarlama
String title = getResources().getString(R.string.chooser_title);
// App Chooser oluşturma
Intent chooser = Intent.createChooser(sendIntent, title);
// İsteği sağlayacak Activity var mı kontrolü
if (sendIntent.resolveActivity(getPackageManager()) != null) {
startActivity(chooser);
}

🔛 Implicit Intent Alma

  • AndroidManifest.xmldosyasında intent-filter ile tanımlanan uygulamalardan biri seçilir

  • intent-filter 0 veya daha fazla action,categoryveya data içerir

  • intent-filter içermeyen Activity'ler sadece explicit intent ile çağrılabilir

  • Birden fazla intent-filter veya bir intent-filter için birden fazla action, category veya data tanımlanabilir

<intent-filter>
<!-- Açılış Activity'si oluduğunu belirtlir -->
<action android:name="android.intent.action.MAIN" />
<!-- Launcher ekranında (telefon ana ekranında) gözükmesini sağlar -->
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<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"/>
</intent-filter>
</activity>
Actions
Categories
Data
  • Action yapısı Intent üzerinde ACTION_ ön eki ile kullanılır

<intent-filter>
<!-- Intent sendIntent = new Intent(Intent.ACTION_SEND); -->
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
  • Category yapısı Intent üzerinde CATEGORY_ ön eki ile kullanılır

  • Tüm implicit intent objelerine varsayılan olarak android.intent.category.DEFAULT atanır

<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>

Alttaki yapıları vardır

  • URI Scheme

  • URI Host

  • URI Path

  • Mime type

<intent-filter>
<data android:mimeType="video/mpeg" android:scheme="http" />
<data android:mimeType="audio/mpeg" android:scheme="http" />
</intent-filter>

🔀 ShareCompat.IntentBuilder ile Veri Paylaşma

  • Sosyal ağ uygulamalarında veri paylaşmak için kullanılan yöntemdir

  • Implicit intent yerine, Android sunduğu bu yapı daha faydalıdır

ShareCompat.IntentBuilder
.from(this) // information about the calling activity
.setType(mimeType) // mime type for the data
.setChooserTitle("Share this text with: ") //title for the app chooser
.setText(txt) // intent data
.startChooser(); // send the intent

👨‍💼 Görevleri Yönetme

  • Android'in çalışma yapısı gereği, Activity'ler eski açık olanı kullanmak yerine kendileri yeni Activity oluştururlar (Şekil 1)

  • Implicit intent ile açılan Activity'ler de, asıl çalışan Activity'den bağımsız olarak açılır (Şekil 2)

Bu yapı Android Launch Modes ile değiştirilebilmektedir.

🏁 Activity launch modes

AndroidManifest.xml dosyası içerisindeki <activity> alanının değiştirilmesi ile yönetilir

💠 Activity Özellikleri

  • Belirtilen launchModedeğerlerinden biri kullanılır

  • Varsayılan olarak standart değeri seçilir

Launch Mode

Anlamı

standart

Android'in varsayılan modu

singleTop

Activity, stack'te en tepede ise yeni işlerde yeni activity oluşturulmaz

singleTask

Activity için yeni bir işlem tanımlandığında, işlem yapan activity kullanılır, yeni oluşturulmaz

singleInstance

Activity yalnızca bir kez oluşturulur

<activity
android:name=".SecondActivity"
android:label="@string/activity2_name"
android:parentActivityName=".MainActivity"
android:launchMode="standard">
<!-- More attributes ... -->
</activity>

🏴 Intent flags

  • Activity attributes gibidir, ama çakışma durumunda bayraklar ele alınır

  • setFlag() ve getFlag() ile kullanılır

Flag

Launch Mode karşılığı

Anlamı

FLAG_ACTIVITY_NEW_TASK

singleTask

İşlem için var olan Activity'i kullanır

FLAG_ACTIVITY_SINGLE_TOP

singleTop

Activity, stack'te en tepede ise yeni işlerde yeni activity oluşturulmaz

FLAG_ACTIVITY_CLEAR_TOP

Eğer activity stack'te varsa, onu tepeye alıp, üstündeki her activity'i destroy eder. FLAG_ACTIVITY_NEW_TASK ile kullanılırsa activity işlemlerini ön plana taşır

‍👨‍💼 Yeni Intent Oluşumunu Yönetme

  • Genellikle onResume()'den sonra çalışır

  • getIntent() metodu her zaman, Activity'nin kendi intent'ini döndürdüğünden bu yapı kullanılır

  • setIntent() ile Activity intent'i değiştirilir

@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// Use the new intent, not the original one
setIntent(intent);
}