Я использую Datadog для отслеживания активности пользователей в своем приложении. Теперь мне нужно настроить веб-просмотры. После инициализации sdk datadog в его документации сказано, что я должен вызвать следующий фрагмент кода:
DatadogEventBridge.setup(webView)
то есть я должен вызвать настройку статического метода и передать ему объект WebView. Но проблема в том, что в моем приложении много таких объектов (много веб-просмотров). Должен ли я помещать этот код в каждый класс, у которого есть атрибут WebView? Или можно каким-то образом использовать функцию обратного вызова, которая вызывается всякий раз, когда создается веб-просмотр, в этом обратном вызове я бы назвал DatadogEventBridge.setup(webView)?
Я попытался использовать обратные вызовы жизненного цикла, а затем получил Activity для каждого метода onResume, чтобы проверить, есть ли у этого действия веб-просмотр. Но все пошло не так.
Я не совсем знаком с Datadog Sdk, но вы можете попробовать создать свой собственный WebView, расширив стандартный, а затем заменив им все остальные WebView. Вот как это будет выглядеть на практике:
class TrackableWebView : WebView {
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int)
: super(context, attrs, defStyleAttr)
init {
DatadogEventBridge.setup(this)
}
}
Я думаю, мы можем предположить, что Sdk будет инициализирован намного раньше, чем WebViews, поэтому не должно быть проблем с вызовом DatadogEventBridge.setup(this)
до инициализации Sdk.
Затем, если вы используете макеты XML, вы просто заменяете стандартный WebView своим собственным:
<com.example.TrackableWebView
android:layout_width = "match_parent"
android:layout_height = "match_parent"/>
Большой! Я об этом не подумала, попробую!
Но у меня все еще есть вопрос: чтобы получить объекты веб-просмотра, я делаю что-то вроде этого: val myWebView = myActivityBinding.myWebView
и это уже идет с типом WebView из Android-фреймворка. Как я могу изменить это, чтобы назначить тип CustomWebView (который наследуется от WebView) моему объекту веб-просмотра??
Я обновил свой ответ, вы просто замените WebView в макете XML.
Вы можете использовать WebViewClient для перехвата создания WebView и последующего вызова DatadogEventBridge.setup(webView)
оттуда.
Вы можете создать класс, который расширяет WebViewClient, а затем добавить его в каждый из ваших WebView с помощью метода WebView.setWebViewClient(WebViewClient wvc)
.
public class DatadogWebViewClient extends WebViewClient {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, URL);
DatadogEventBridge.setup(view);
}
}
«Или возможно каким-то образом использовать функцию обратного вызова, которая вызывается всякий раз, когда создается веб-просмотр» - извините, такого обратного вызова нет. «Но что-то пошло не так» — без минимального воспроизводимого примера мы не сможем вам помочь с этой проблемой. «Но проблема в том, что в моем приложении есть много таких объектов (много веб-просмотров)» — возможно, вам следует использовать наследование, композицию или другие подходы для уменьшения количества отдельных фрагментов кода, которые имеют дело с
WebView
.