Возможно ли получить имя taskAffinity, которому принадлежит действие во время выполнения?

#android

#Android

Вопрос:

Мне было интересно, возможно ли получить имя taskAffinity , которому Activity принадлежит, во время выполнения?

Я просматриваю, но не могу найти способ сделать это.

Ответ №1:

Из документации Android

Сходство действия определяется атрибутом taskAffinity . Сходство задачи определяется путем считывания сходства ее корневой активности. Поэтому, по определению, корневая активность всегда находится в задаче с одинаковым сродством.

Итак, чтобы получить taskAffinity действия, мы получим taskAffinity корневого действия (действия в нижней части стека).

Вот решение:

ActivityUtils.java

 public static String getTaskAffinity(Activity activity) {
    ActivityManager am = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.AppTask> appTaskList = am.getAppTasks();

    int taskId;
    for (ActivityManager.AppTask appTask : appTaskList) {
        ActivityManager.RecentTaskInfo taskInfo = appTask.getTaskInfo();

        // Get the id of the task
        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.Q) {
            taskId = taskInfo.id;
        } else {
            taskId = taskInfo.taskId;
        }

        // Detect the task that the activity is belonged to
        if (activity.getTaskId() == taskId) {
            ComponentName rootActivity = taskInfo.baseActivity;
            try {
                PackageManager pm = activity.getPackageManager();
                ActivityInfo ai = pm.getActivityInfo(rootActivity, PackageManager.GET_META_DATA);
                return ai.taskAffinity;
            } catch (PackageManager.NameNotFoundException e) {
                return null;
            }
        }
    }
    return null;
}
 

Использование из Activity:

 String taskAffinity = ActivityUtils.getTaskAffinity(this);
 

Использование из фрагмента

 String taskAffinity = ActivityUtils.getTaskAffinity(requireActivity());