<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%B8%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B9_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F</id>
	<title>Инструментарий для анализа действий пользователя - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%B8%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B9_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F"/>
	<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%B8%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B9_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F&amp;action=history"/>
	<updated>2026-09-16T14:08:09Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://doc.ruscomtech.ru/index.php?title=%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%B8%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B9_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F&amp;diff=6588&amp;oldid=prev</id>
		<title>IKuznetsov: Новая страница: «= Инструментарий для анализа действий пользователя =  Действие пользователя представляет собой важную операцию в вашем приложении — оно объединяет запросы, навигации и ошибки, возникающие в результате одного взаимодействия пользователя, в одно событ...»</title>
		<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%B8%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B9_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F&amp;diff=6588&amp;oldid=prev"/>
		<updated>2026-08-19T16:56:22Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «= Инструментарий для анализа действий пользователя =  Действие пользователя представляет собой важную операцию в вашем приложении — оно объединяет запросы, навигации и ошибки, возникающие в результате одного взаимодействия пользователя, в одно событ...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Инструментарий для анализа действий пользователя =&lt;br /&gt;
&lt;br /&gt;
Действие пользователя представляет собой важную операцию в вашем приложении — оно объединяет запросы, навигации и ошибки, возникающие в результате одного взаимодействия пользователя, в одно событие. Полный концептуальный обзор того, как начинаются, заканчиваются действия пользователя и какие данные они собирают, см. в разделе «Действия пользователя». Разделы ниже содержат только сведения об инструментировании, специфичные для &amp;#039;&amp;#039;&amp;#039;Android&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Автоматизированные измерительные приборы ==&lt;br /&gt;
&lt;br /&gt;
Автоматические действия пользователя вызываются взаимодействием пользователя с обработчиком действий.&lt;br /&gt;
&lt;br /&gt;
=== Названия действий пользователя ===&lt;br /&gt;
&lt;br /&gt;
Общий шаблон именования описан в разделе «Действия пользователя». На &amp;#039;&amp;#039;&amp;#039;Android&amp;#039;&amp;#039;&amp;#039; две части имени обрабатываются следующим образом:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Имя экрана&amp;#039;&amp;#039;&amp;#039;: Полное имя класса, в котором &amp;lt;code&amp;gt;Activity&amp;lt;/code&amp;gt; произошло касание, например, &amp;lt;code&amp;gt;com.example.MainActivity&amp;lt;/code&amp;gt;. Если вы зададите пользовательское имя представления через API, будет использоваться это имя.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Имя элемента&amp;#039;&amp;#039;&amp;#039;: ЕдиныйАгент использует имя типа компонента элемента, который обрабатывал выбор, например, &amp;lt;code&amp;gt;Button&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;MaterialCardView&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Нажмите на кнопку в &amp;lt;code&amp;gt;com.example.MainActivity&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Примеры обработчиков действий ===&lt;br /&gt;
&lt;br /&gt;
Обработчик действий — это код приложения, привязанный к взаимодействию пользователя, который реализует поведение, запускаемое этим взаимодействием. Только взаимодействия пользователя, к которым прикреплен обработчик действий, могут приводить к выполнению действия пользователем.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Представление Android&amp;#039;&amp;#039;&amp;#039;: Логика выполняется в &amp;lt;code&amp;gt;OnClickListener&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Jetpack Compose&amp;#039;&amp;#039;&amp;#039;: Логика выполняется с помощью модификатора &amp;lt;code&amp;gt;clickable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подробное описание обработчиков действий см. в разделе «Взаимодействие с пользователем».&lt;br /&gt;
&lt;br /&gt;
=== Настройка автоматической инструментальной обработки ===&lt;br /&gt;
&lt;br /&gt;
Используется &amp;lt;code&amp;gt;Astromkey.setAutomaticUserActionDetection(boolean)&amp;lt;/code&amp;gt; для активации или деактивации автоматического определения действий пользователя во время выполнения. Автоматическое определение активно по умолчанию.&lt;br /&gt;
&lt;br /&gt;
При отключении автоматического определения действия пользователя, их взаимодействие с пользователем больше не запускает автоматическое создание действий. Действия пользователя, созданные вручную, &amp;lt;code&amp;gt;createUserAction&amp;lt;/code&amp;gt; остаются без изменений.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kotlin&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Astromkey.setAutomaticUserActionDetection(false)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Java&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Astromkey.setAutomaticUserActionDetection(false);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ручные измерительные приборы ==&lt;br /&gt;
&lt;br /&gt;
Действия пользователей, запускаемые через API, позволяют отслеживать пользовательские рабочие процессы, которые агент не может автоматизировать, например, многоэтапные бизнес-процессы, фоновые задачи или взаимодействия, охватывающие несколько экранов.&lt;br /&gt;
&lt;br /&gt;
=== Создать действие пользователя ===&lt;br /&gt;
&lt;br /&gt;
Используйте &amp;lt;code&amp;gt;Astromkey.createUserAction(UserActionConfiguration)&amp;lt;/code&amp;gt; для запуска действия пользователя, инициируемого API. Передайте объект &amp;lt;code&amp;gt;UserActionConfiguration&amp;lt;/code&amp;gt; с пользовательским именем, описывающим отслеживаемый вами рабочий процесс. Вызовите функцию &amp;lt;code&amp;gt;complete()&amp;lt;/code&amp;gt; по завершении рабочего процесса.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;createUserAction&amp;lt;/code&amp;gt; всегда возвращает действие пользователя, а некорректное использование (например, указание пустого пользовательского имени) обрабатывается без уведомления.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kotlin&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
val userAction = Astromkey.createUserAction(&lt;br /&gt;
    UserActionConfiguration(&amp;quot;Процесс оформления заказа&amp;quot;)&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
// ... выполнить рабочий процесс ...&lt;br /&gt;
&lt;br /&gt;
userAction.complete()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Java&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UserAction userAction = Astromkey.createUserAction(&lt;br /&gt;
    new UserActionConfiguration(&amp;quot;Процесс оформления заказа&amp;quot;)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
// ... выполнить рабочий процесс ...&lt;br /&gt;
&lt;br /&gt;
userAction.complete();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое завершение ===&lt;br /&gt;
&lt;br /&gt;
По умолчанию вызов необходимо выполнить &amp;lt;code&amp;gt;complete()&amp;lt;/code&amp;gt; явно. Если ваш рабочий процесс запускает веб-запросы, и вы хотите, чтобы действие пользователя автоматически завершалось после завершения всех выполняющихся запросов, активируйте этот параметр &amp;lt;code&amp;gt;withCompleteAutomatically(true)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kotlin&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
val userAction = Astromkey.createUserAction(&lt;br /&gt;
    UserActionConfiguration(&amp;quot;Процесс оформления заказа&amp;quot;)&lt;br /&gt;
        .withCompleteAutomatically(true)&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
// Действие пользователя завершается автоматически после окончания обработки ожидающих запросов.&lt;br /&gt;
// Вы по-прежнему можете вызвать метод complete(), чтобы закрыть его раньше.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вы также можете изменить это поведение в любой момент времени в течение выполнения действия пользователем с помощью &amp;lt;code&amp;gt;setCompleteAutomatically(boolean)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Добавить свойства события ===&lt;br /&gt;
&lt;br /&gt;
Используется &amp;lt;code&amp;gt;addEventProperty&amp;lt;/code&amp;gt; для прикрепления пользовательских данных к действию пользователя. Ключи свойств должны иметь префикс &amp;lt;code&amp;gt;event_properties.&amp;lt;/code&amp;gt;. Свойства, добавленные после &amp;lt;code&amp;gt;complete()&amp;lt;/code&amp;gt; вызова метода, игнорируются без уведомления.&lt;br /&gt;
&lt;br /&gt;
Правила и ограничения именования свойств см. в разделе «Свойства событий и сессий».&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kotlin&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
val userAction = Astromkey.createUserAction(&lt;br /&gt;
    UserActionConfiguration(&amp;quot;Процесс оформления заказа&amp;quot;)&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
userAction.addEventProperty(&amp;quot;event_properties.payment_method&amp;quot;, &amp;quot;credit_card&amp;quot;)&lt;br /&gt;
userAction.addEventProperty(&amp;quot;event_properties.cart_value&amp;quot;, 149.99)&lt;br /&gt;
userAction.addEventProperty(&amp;quot;event_properties.item_count&amp;quot;, 3)&lt;br /&gt;
&lt;br /&gt;
// ... выполнить рабочий процесс ...&lt;br /&gt;
&lt;br /&gt;
userAction.complete()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Java&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UserAction userAction = Astromkey.createUserAction(&lt;br /&gt;
    new UserActionConfiguration(&amp;quot;Процесс оформления заказа&amp;quot;)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
userAction.addEventProperty(&amp;quot;event_properties.payment_method&amp;quot;, &amp;quot;credit_card&amp;quot;);&lt;br /&gt;
userAction.addEventProperty(&amp;quot;event_properties.cart_value&amp;quot;, 149.99);&lt;br /&gt;
userAction.addEventProperty(&amp;quot;event_properties.item_count&amp;quot;, 3);&lt;br /&gt;
&lt;br /&gt;
// ... выполнить рабочий процесс ...&lt;br /&gt;
&lt;br /&gt;
userAction.complete();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пример: Процесс оформления заказа в интернет-магазине ===&lt;br /&gt;
&lt;br /&gt;
В следующем примере отслеживается процесс оформления заказа как единое действие пользователя, охватывающее несколько методов. Действие запускается в обработчике кнопки, так что время его начала совпадает с выбором пользователя, сохраняется в качестве поля в &amp;#039;&amp;#039;&amp;#039;ViewModel&amp;#039;&amp;#039;&amp;#039; во время обработки платежа и закрывается — с прикрепленными свойствами результата — как в пути успешного завершения, так и в пути ошибки.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kotlin&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class CheckoutViewModel(&lt;br /&gt;
    private val paymentRepository: PaymentRepository&lt;br /&gt;
) : ViewModel() {&lt;br /&gt;
&lt;br /&gt;
    private var checkoutAction: UserAction? = null&lt;br /&gt;
&lt;br /&gt;
    // Вызывается из пользовательского интерфейса, когда пользователь нажимает кнопку &amp;quot;Оформить заказ&amp;quot;.&lt;br /&gt;
    fun onCheckoutButtonClicked(cart: Cart) {&lt;br /&gt;
        checkoutAction = Astromkey.createUserAction(&lt;br /&gt;
            UserActionConfiguration(&amp;quot;Процесс оформления заказа&amp;quot;)&lt;br /&gt;
        ).apply {&lt;br /&gt;
            addEventProperty(&amp;quot;event_properties.cart_id&amp;quot;, cart.id)&lt;br /&gt;
            addEventProperty(&amp;quot;event_properties.item_count&amp;quot;, cart.items.size)&lt;br /&gt;
            addEventProperty(&amp;quot;event_properties.cart_total&amp;quot;, cart.total)&lt;br /&gt;
            addEventProperty(&amp;quot;event_properties.currency&amp;quot;, cart.currency)&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        processPayment(cart)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private fun processPayment(cart: Cart) {&lt;br /&gt;
        viewModelScope.launch {&lt;br /&gt;
            try {&lt;br /&gt;
                val result = paymentRepository.processPayment(cart)&lt;br /&gt;
                completeCheckout(orderId = result.orderId)&lt;br /&gt;
            } catch (e: Exception) {&lt;br /&gt;
                cancelCheckout(reason = e.message ?: &amp;quot;unknown_error&amp;quot;)&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private fun completeCheckout(orderId: String) {&lt;br /&gt;
        checkoutAction?.let {&lt;br /&gt;
            it.addEventProperty(&amp;quot;event_properties.order_id&amp;quot;, orderId)&lt;br /&gt;
            it.addEventProperty(&amp;quot;event_properties.checkout_successful&amp;quot;, true)&lt;br /&gt;
            it.complete()&lt;br /&gt;
        }&lt;br /&gt;
        checkoutAction = null&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private fun cancelCheckout(reason: String) {&lt;br /&gt;
        checkoutAction?.let {&lt;br /&gt;
            it.addEventProperty(&amp;quot;event_properties.checkout_successful&amp;quot;, false)&lt;br /&gt;
            it.addEventProperty(&amp;quot;event_properties.cancellation_reason&amp;quot;, reason)&lt;br /&gt;
            it.complete()&lt;br /&gt;
        }&lt;br /&gt;
        checkoutAction = null&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Java&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CheckoutViewModel extends ViewModel {&lt;br /&gt;
&lt;br /&gt;
    private final PaymentRepository paymentRepository;&lt;br /&gt;
    private UserAction checkoutAction = null;&lt;br /&gt;
&lt;br /&gt;
    public CheckoutViewModel(PaymentRepository paymentRepository) {&lt;br /&gt;
        this.paymentRepository = paymentRepository;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Вызывается из пользовательского интерфейса, когда пользователь нажимает кнопку &amp;quot;Оформить заказ&amp;quot;.&lt;br /&gt;
    public void onCheckoutButtonClicked(Cart cart) {&lt;br /&gt;
        checkoutAction = Astromkey.createUserAction(&lt;br /&gt;
            new UserActionConfiguration(&amp;quot;Процесс оформления заказа&amp;quot;)&lt;br /&gt;
        );&lt;br /&gt;
        checkoutAction.addEventProperty(&amp;quot;event_properties.cart_id&amp;quot;, cart.getId());&lt;br /&gt;
        checkoutAction.addEventProperty(&amp;quot;event_properties.item_count&amp;quot;, cart.getItems().size());&lt;br /&gt;
        checkoutAction.addEventProperty(&amp;quot;event_properties.cart_total&amp;quot;, cart.getTotal());&lt;br /&gt;
        checkoutAction.addEventProperty(&amp;quot;event_properties.currency&amp;quot;, cart.getCurrency());&lt;br /&gt;
&lt;br /&gt;
        processPayment(cart);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void processPayment(Cart cart) {&lt;br /&gt;
        paymentRepository.processPayment(cart, new PaymentCallback() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onSuccess(PaymentResult result) {&lt;br /&gt;
                completeCheckout(result.getOrderId());&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onError(String errorMessage) {&lt;br /&gt;
                cancelCheckout(errorMessage != null ? errorMessage : &amp;quot;unknown_error&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void completeCheckout(String orderId) {&lt;br /&gt;
        if (checkoutAction != null) {&lt;br /&gt;
            checkoutAction.addEventProperty(&amp;quot;event_properties.order_id&amp;quot;, orderId);&lt;br /&gt;
            checkoutAction.addEventProperty(&amp;quot;event_properties.checkout_successful&amp;quot;, true);&lt;br /&gt;
            checkoutAction.complete();&lt;br /&gt;
            checkoutAction = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void cancelCheckout(String reason) {&lt;br /&gt;
        if (checkoutAction != null) {&lt;br /&gt;
            checkoutAction.addEventProperty(&amp;quot;event_properties.checkout_successful&amp;quot;, false);&lt;br /&gt;
            checkoutAction.addEventProperty(&amp;quot;event_properties.cancellation_reason&amp;quot;, reason);&lt;br /&gt;
            checkoutAction.complete();&lt;br /&gt;
            checkoutAction = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>IKuznetsov</name></author>
	</entry>
</feed>