Görev modunu kilitleme

Bu geliştirici kılavuzunda, özel cihazların tek bir uygulamaya veya bir uygulama grubuna nasıl kilitlenebileceği açıklanmaktadır. Kurumsal Mobilite Yönetimi (EMM) geliştiricisi veya çözüm entegratörüyseniz çözümünüze kilitleme görevi modu eklemek için bu kılavuzu okuyun.

Genel bakış

Android, görevleri kilit görevi modu adı verilen kiosk benzeri bir şekilde çalıştırabilir. Bir uygulama koleksiyonunu sunmak için bir kiosk uygulaması veya başlatıcı geliştiriyorsanız görev kilitleme modunu kullanabilirsiniz. Sistem kilit görevi modunda çalıştığında cihaz kullanıcıları genellikle bildirimleri göremez, izin verilenler listesinde olmayan uygulamalara erişemez veya ana ekran izin verilenler listesine eklenmediği sürece ana ekrana dönemez.

Sistem kilit görevi modundayken yalnızca bir cihaz politikası denetleyici (DPC) tarafından izin verilenler listesine eklenmiş uygulamalar çalışabilir. Cihazı kullanan kişi her zaman kilit görevi modundan çıkamadığı için uygulamalar izin verilenler listesine eklenir.

Kilit görevi modu için izin verilenler listesine eklenen uygulama ile izin verilenler listesine ekleme DPC'sini nasıl birleştireceğiniz, çözmek istediğiniz soruna bağlı olarak değişir. Bazı örnekler:

  • Bir kiosk (içerik sunmak için) ile mini DPC'yi (kilit görevi modu için kendisini izin verilenler listesine eklemek için) birleştiren tek bir uygulama paketi.
  • Müşterinin mobil uygulamalarını kilit görevi modunda başlatan, kurumsal mobilite yönetimi çözümünün bir parçası olan DPC.

Kullanılabilirlik

Sistem, Android 5.0 veya sonraki sürümlerde kilit görevi modunda çalışabilir. Tablo 1'de, Android'in hangi sürümlerinin kullanıcı bazında uygulamaları izin verilenler listesine eklemeyi desteklediği gösterilmektedir.

Tablo 1. DPC yönetici modları için Android sürümü desteği
Android sürümü DPC yöneticileri Notlar
Android 5.0 (API düzeyi 21) veya sonraki sürümler Tümüyle yönetilen cihaz
Android 8.0 (API düzeyi 26) veya sonraki sürümler İlişkili ikincil kullanıcı İkincil kullanıcı, birincil kullanıcıyla ilişkili olmalıdır. Birden çok kullanıcıya genel bakışı inceleyin.
Android 9.0 (API düzeyi 28) veya sonraki sürümler İkincil kullanıcı

Android 9.0 veya sonraki sürümlerde DPC, herhangi bir uygulamanın etkinliğini kilit görevi modunda başlatabilir. Önceki sürümlerde, uygulamanın kilit görevi modunda kendi etkinliğinin başlatılmasını zaten desteklemesi gerekir.

Uygulamaları izin verilenler listesine ekle

DPC'nin uygulamaları kilit görevi modunda kullanılabilmesi için izin verilenler listesine eklemesi gerekir. Aşağıdaki örnekte gösterildiği gibi, kilitleme görevi modu için uygulamaları izin verilenler listesine eklemek üzere DevicePolicyManager.setLockTaskPackages() yöntemini çağırın:

Kotlin

// Allowlist two apps.
private val KIOSK_PACKAGE = "com.example.kiosk"
private val PLAYER_PACKAGE = "com.example.player"
private val APP_PACKAGES = arrayOf(KIOSK_PACKAGE, PLAYER_PACKAGE)

// ...

val context = context
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE)
        as DevicePolicyManager
val adminName = getComponentName(context)
dpm.setLockTaskPackages(adminName, APP_PACKAGES)

Java

// Allowlist two apps.
private static final String KIOSK_PACKAGE = "com.example.kiosk";
private static final String PLAYER_PACKAGE = "com.example.player";
private static final String[] APP_PACKAGES = {KIOSK_PACKAGE, PLAYER_PACKAGE};

// ...

Context context = getContext();
DevicePolicyManager dpm =
    (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminName = getComponentName(context);
dpm.setLockTaskPackages(adminName, APP_PACKAGES);

DPC, daha önce kilit görevi modu için izin verilenler listesine eklenmiş uygulamaları öğrenmek için DevicePolicyManager.getLockTaskPackages() numarasını arayabilir. Diğer uygulamalar, bir uygulama paketinin kilit görevi modunu desteklediğini onaylamak için DevicePolicyManager.isLockTaskPermitted() numarasını arayabilir.

Kilit görevi modunu başlat

Android 9.0 (API düzeyi 28) veya sonraki sürümlerde, başka bir uygulamanın etkinliğini kilit görevi modunda başlatabilirsiniz. Bir etkinlik zaten ön planda veya arka planda çalışıyorsa etkinliği yeniden başlatmanız gerekir. ActivityOptions.setLockTaskEnabled() numaralı telefonu arayın ve etkinliği başlatırken aşağıdaki seçenekleri sağlayın. Aşağıdaki snippet bunu yapmanın bir yolunu göstermektedir:

Kotlin

// Set an option to turn on lock task mode when starting the activity.
val options = ActivityOptions.makeBasic()
options.setLockTaskEnabled(true)

// Start our kiosk app's main activity with our lock task mode option.
val packageManager = context.packageManager
val launchIntent = packageManager.getLaunchIntentForPackage(KIOSK_PACKAGE)
if (launchIntent != null) {
    context.startActivity(launchIntent, options.toBundle())
}

Java

// Set an option to turn on lock task mode when starting the activity.
ActivityOptions options = ActivityOptions.makeBasic();
options.setLockTaskEnabled(true);

// Start our kiosk app's main activity with our lock task mode option.
PackageManager packageManager = context.getPackageManager();
Intent launchIntent = packageManager.getLaunchIntentForPackage(KIOSK_PACKAGE);
if (launchIntent != null) {
  context.startActivity(launchIntent, options.toBundle());
}

9.0'dan önceki Android sürümlerinde uygulamalar, Activity.startLockTask() yöntemini çağırarak kilit görev modunda kendi etkinliklerini başlatır. Bu yöntemi çağırmak için etkinliğin ön planda çalışıyor olması gerekir (bkz. Etkinlik yaşam döngüsü kavramları). Bu nedenle, Activity veya Fragment onResume() yöntemini kullanarak çağırmanızı öneririz. startLockTask() numaralı telefonu nasıl arayacağınız aşağıda açıklanmıştır:

Kotlin

// In our Fragment subclass.
override fun onResume() {
    super.onResume()
    // First, confirm that this package is allowlisted to run in lock task mode.
    if (dpm.isLockTaskPermitted(context.packageName)) {
        activity.startLockTask()
    } else {
        // Because the package isn't allowlisted, calling startLockTask() here
        // would put the activity into screen pinning mode.
    }
}

Java

// In our Fragment subclass.
@Override
public void onResume() {
  super.onResume();

  // First, confirm that this package is allowlisted to run in lock task mode.
  if (dpm.isLockTaskPermitted(context.getPackageName())) {
    getActivity().startLockTask();
  } else {
    // Because the package isn't allowlisted, calling startLockTask() here
    // would put the activity into screen pinning mode.
  }
}

Kullanıcı cihazın kilidini açamayabilir. Bu nedenle cihaz kilitliyken görev modunu başlatmayın. Cihazın kilitli olup olmadığını öğrenmek için KeyguardManager yöntemlerini çağırabilir ve kilitleme görevi modunu başlatmak için Activity yaşam döngüsü geri çağırması (ör. kilit açıldıktan sonra çağrılan onResume()) kullanabilirsiniz.

Kilit görevi modundaki bir uygulama, etkinlik yeni bir görev başlatmadığı sürece yeni etkinlikler başlatabilir (izin verilenler listesine eklenmiş bir uygulamayı başlatan görevler hariç). Görevlerin etkinliklerle ilişkisini anlamak için Görevleri ve Geri Yığını Anlama kılavuzunu okuyun.

Alternatif olarak, uygulama manifest dosyanızda sistem kilit görevi modunda çalışırken bir etkinliğin nasıl davranması gerektiğini belirtebilirsiniz. Sistemin etkinliğinizi kilit görev modunda otomatik olarak çalıştırmasını sağlamak için android:lockTaskMode özelliğini aşağıdaki örnekte gösterildiği gibi if_whitelisted olarak ayarlayın:

<activity
    android:name=".MainActivity"
    android:lockTaskMode="if_whitelisted">
    <!-- ... -->
</activity>

lockTaskMode referansını okuyarak uygulama manifest dosyasında seçenekleri bildirme hakkında daha fazla bilgi edinebilirsiniz.

Görev kilitleme modunu durdur

DPC, uygulama paketini izin verilenler listesinden kaldırarak görev modunu uzaktan durdurabilir. Android 6.0 (API düzeyi 23) veya sonraki sürümlerde DevicePolicyManager.setLockTaskPackages() kodunu çağırın ve paket adını izin verilenler listesi dizisinden çıkarın. İzin verilenler listesini güncellediğinizde uygulama, yığındaki önceki göreve geri döner.

Daha önce startLockTask() adlı bir etkinlik varsa görev kilitleme modunu durdurmak için Activity.stopLockTask() işlemini çağırabilir. Bu yöntem yalnızca kilitleme görevi modunu başlatan etkinlik için çalışır.

Yaşam döngüsü geri aramaları

DPC'niz, bir uygulamanın (aynı kullanıcıda çalışan) kilit görevi moduna ne zaman girdiğini ve bu moddan ne zaman çıktığını bilmek yararlı olabilir. Geri çağırmaları almak için DPC'nizin DeviceAdminReceiver alt sınıfında aşağıdaki geri çağırma yöntemlerini geçersiz kılın:

onLockTaskModeEntering()
Bir uygulama kilit görevi moduna girdikten sonra çağrılır. Bir uygulamanın paket adını pkg bağımsız değişkeninden alabilirsiniz.
onLockTaskModeExiting()
Bir uygulama kilitleme görevi modundan çıktıktan sonra çağrılır. Bu geri çağırma, uygulama hakkında bilgi almaz.

Başka bir uygulamayı kilit görevi modunda başlatırsanız çalışma durumunu kendi uygulamanızda izlemeniz gerekir. Mevcut uygulamanın kilit görevi modunda çalışıp çalışmadığını kontrol etmek için ActivityManager üzerindeki yöntemleri aşağıdaki örnekte gösterildiği gibi kullanın:

Kotlin

// Check if this app is in lock task mode. Screen pinning doesn't count.
var isLockTaskModeRunning = false

val activityManager = context
        .getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    isLockTaskModeRunning =
            activityManager.lockTaskModeState ==
            ActivityManager.LOCK_TASK_MODE_LOCKED
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    // Deprecated in API level 23.
    isLockTaskModeRunning = activityManager.isInLockTaskMode
}

if (isLockTaskModeRunning) {
    // Show the exit button ...
}

Java

// Check if this app is in lock task mode. Screen pinning doesn't count.
boolean isLockTaskModeRunning = false;

ActivityManager activityManager = (ActivityManager)
    getContext().getSystemService(Context.ACTIVITY_SERVICE);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  isLockTaskModeRunning = activityManager.getLockTaskModeState()
      == ActivityManager.LOCK_TASK_MODE_LOCKED;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  // Deprecated in API level 23.
  isLockTaskModeRunning = activityManager.isInLockTaskMode();
}

if (isLockTaskModeRunning) {
  // Show the exit button ...
}

Kullanıcı arayüzünü özelleştirme

Bir uygulama kilit görevi modunda çalıştığında sistem kullanıcı arayüzü (UI) aşağıdaki şekillerde değişir:

  • Durum çubuğu boş, bildirimler ve sistem bilgileri gizlenmiş.
  • Ana Sayfa ve Genel Bakış düğmeleri gizlenir.
  • Diğer uygulamalar yeni etkinlik başlatamaz.
  • Kilit ekranı (ayarlanmışsa) devre dışı bırakılır.

Android 9.0 veya sonraki sürümlerde görev kilitleme modu etkinleştirildiğinde DPC'niz, cihazdaki belirli sistem kullanıcı arayüzü özelliklerini etkinleştirebilir. Bu, geliştiricilerin özel bir başlatıcı oluşturması için kullanışlıdır. Aşağıdaki snippet'te gösterildiği gibi DevicePolicyManager.setLockTaskFeatures() kodunu çağırın:

Kotlin

// Enable the Home and Overview buttons so that our custom launcher can respond
// using our custom activities. Implicitly disables all other features.
dpm.setLockTaskFeatures(
        adminName,
        DevicePolicyManager.LOCK_TASK_FEATURE_HOME or
              DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW)

Java

// Enable the Home and Overview buttons so that our custom launcher can respond
// using our custom activities. Implicitly disables all other features.
dpm.setLockTaskFeatures(adminName,
    DevicePolicyManager.LOCK_TASK_FEATURE_HOME |
          DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW);

Sistem, flags bağımsız değişkenine eklemediğiniz tüm özellikleri devre dışı bırakır. Etkinleştirilen kullanıcı arayüzü özellikleri, görev kilitleme moduna geçişler arasında değişmeden kalır. Cihaz zaten kilit görevi modundaysa kilitleme görevi özelliklerinde yaptığınız değişiklikler hemen gösterilir. Tablo 2'de, özelleştirebileceğiniz kullanıcı arayüzü özellikleri açıklanmaktadır.

Tablo 2. Kilit görevi modunda özelleştirilebilir sistem kullanıcı arayüzü özellikleri
Sistem kullanıcı arayüzü özelliği Açıklama
LOCK_TASK_FEATURE_HOME Ana Sayfa düğmesini gösterir. Özel başlatıcılar için etkinleştir: Varsayılan Android başlatıcıyı izin verilenler listesine eklemediğiniz sürece etkin bir Ana Sayfa düğmesine dokunduğunuzda hiçbir işlem yapılmaz.
LOCK_TASK_FEATURE_OVERVIEW Genel Bakış düğmesini gösterir (bu düğmeye dokunduğunuzda Son Kullanılanlar ekranı açılır). Bu düğmeyi etkinleştirirseniz Ana Sayfa düğmesini de etkinleştirmelisiniz.
LOCK_TASK_FEATURE_GLOBAL_ACTIONS Güç düğmesine uzun basıldığında gösterilen genel işlemler iletişim kutusunu etkinleştirir. setLockTaskFeatures() çağrılmadığında etkinleştirilen tek özellik. Bu iletişim kutusunu devre dışı bırakırsanız kullanıcı genellikle cihazı kapatamaz.
LOCK_TASK_FEATURE_NOTIFICATIONS Tüm uygulamalar için bildirimleri etkinleştirir. Bu simge durum çubuğunda, uyarı bildirimlerinde ve genişletilebilir bildirim gölgesinde bildirim simgelerini gösterir. Bu düğmeyi etkinleştirirseniz Ana Sayfa düğmesini de etkinleştirmelisiniz. Yeni paneller açan bildirim işlemlerine ve düğmelere dokunmak görev kilitleme modunda çalışmaz.
LOCK_TASK_FEATURE_SYSTEM_INFO Bağlantı, pil, ses ve titreşim seçenekleri gibi göstergeler içeren durum çubuğunun sistem bilgisi alanını etkinleştirir.
LOCK_TASK_FEATURE_KEYGUARD Cihazda ayarlanmış olabilecek tüm kilit ekranlarını etkinleştirir. Genellikle bilgi büfeleri veya dijital tabelalar gibi herkese açık kullanıcıları olan cihazlar için uygun değildir.
LOCK_TASK_FEATURE_NONE Yukarıda listelenen tüm sistem arayüzü özelliklerini devre dışı bırakır.

DPC, görev kilitleme modu etkinleştirildiğinde cihazda kullanılabilen özelliklerin listesini almak için DevicePolicyManager.getLockTaskFeatures()'i arayabilir. Bir cihaz kilit görevi modundan çıktığında kullanıcı arayüzü mevcut cihaz politikaları tarafından zorunlu kılınan duruma geri döner.

Pencereleri ve yer paylaşımlarını engelleme

Bir uygulama kilit görevi modunda çalıştığında, diğer uygulamalar ve arka plan hizmetleri Android'in kilit görevi modunda uygulamanın önünde gösterdiği yeni pencereler oluşturabilir. Uygulamalar ve hizmetler, cihazı kullanan kişiye durum mesajı, iletişim kutusu ve yer paylaşımları göstermek için bu pencereleri oluşturur. DPC'niz, DISALLOW_CREATE_WINDOWS kullanıcı kısıtlamasını ekleyerek bunları önleyebilir. Aşağıdaki örnekte, bunu onLockTaskModeEntering() geri çağırmasında nasıl yapabileceğiniz gösterilmektedir:

Kotlin

// Called just after entering lock task mode.
override fun onLockTaskModeEntering(context: Context, intent: Intent) {
    val dpm = getManager(context)
    val admin = getWho(context)

    dpm.addUserRestriction(admin, UserManager.DISALLOW_CREATE_WINDOWS)
}

Java

// Called just after entering lock task mode.
public void onLockTaskModeEntering(Context context, Intent intent) {
  DevicePolicyManager dpm = getManager(context);
  ComponentName admin = getWho(context);

  dpm.addUserRestriction(admin, UserManager.DISALLOW_CREATE_WINDOWS);
}

Cihaz kilit görevi modundan çıktığında DPC'niz kullanıcı kısıtlamasını kaldırabilir.

Ek kaynaklar

Özel cihazlar hakkında daha fazla bilgi edinmek için aşağıdaki dokümanları okuyun: