Widget de Android (Widget)

1. Ejemplos

1.1 Pasos

  1. Cree un nuevo proyecto de Android y abra el archivo de clase principal de Kotlin (normalmente MainActivity.kt).

  2. En MainActivity.kt, cree una nueva clase para definir el widget. Por ejemplo, puedes crear una MyWidgetclase llamada .

class MyWidget : AppWidgetProvider() {
    
    
    override fun onUpdate(
        context: Context,
        appWidgetManager: AppWidgetManager,
        appWidgetIds: IntArray
    ) {
    
    
        // 在此处更新微件的视图和内容
    }
}
  1. AndroidManifest.xmlRegistre la clase de widget en el archivo . <application>Agregue lo siguiente dentro de la etiqueta :
<receiver android:name=".MyWidget">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data
        android:name="android.appwidget.provider"
        android:resource="@xml/my_widget_info" />
</receiver>
  1. Cree un my_widget_info.xmlarchivo XML con un nombre para definir la apariencia y el comportamiento del widget. Agregue lo siguiente al res/xml/my_widget_info.xmlarchivo:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="40dp"
    android:minHeight="40dp"
    android:updatePeriodMillis="0"
    android:initialLayout="@layout/my_widget_layout" />

Nota: en el ejemplo anterior @layout/my_widget_layouthay un archivo de recursos que especifica el diseño del widget; debe crear un my_widget_layout.xmlarchivo de diseño llamado .

  1. Cree un my_widget_layout.xmlarchivo de diseño llamado para definir la interfaz de usuario del widget. Agregue lo siguiente al res/layout/my_widget_layout.xmlarchivo:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!-- 添加微件的视图元素 -->

</LinearLayout>
  1. En MyWidgetel onUpdatemétodo de la clase, use RemoteViewsel objeto para actualizar la vista y el contenido del widget. Agregue el siguiente código al onUpdatemétodo:
override fun onUpdate(
    context: Context,
    appWidgetManager: AppWidgetManager,
    appWidgetIds: IntArray
) {
    
    
    for (appWidgetId in appWidgetIds) {
    
    
        val views = RemoteViews(context.packageName, R.layout.my_widget_layout)
        
        // 在此处配置微件的视图和内容
        
        appWidgetManager.updateAppWidget(appWidgetId, views)
    }
}
  1. Configure la vista y el contenido del widget configurando viewsel método del objeto, por ejemplo:
views.setTextViewText(R.id.widget_text, "Hello, Widget!") // 设置 TextView 的文本
  1. Guarde y cree su proyecto de Android.

1.2, código completo

class MyWidget : AppWidgetProvider() {
    
    

    override fun onUpdate(
        context: Context?,
        appWidgetManager: AppWidgetManager?,
        appWidgetIds: IntArray?
    ) {
    
    

        if (appWidgetIds != null) {
    
    
            for (appWidgetId in appWidgetIds) {
    
    
                val views = RemoteViews(context?.packageName ?: "", R.layout.my_widget_layout)

                // 在此处配置微件的视图和内容
                views.setTextViewText(R.id.widget_text, "Hello, Widget!"); // 设置 TextView 的文本

                appWidgetManager?.updateAppWidget(appWidgetId, views)
            }
        }
        super.onUpdate(context, appWidgetManager, appWidgetIds)
    }

}

2. Solicitar red

    override fun onUpdate(
        context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray
    ) {
    
    
        val scope = CoroutineScope(Dispatchers.Default)
        scope.launch {
    
    
            // 在后台线程中执行网络请求
            val result = makeNetworkRequest()
            // 更新微件的视图和内容
            withContext(Dispatchers.Main) {
    
    
                updateWidgetViews(context, appWidgetManager, appWidgetIds, result)
            }
        }
    }

    private suspend fun makeNetworkRequest(): String {
    
    
        // 执行网络请求并返回结果
        val url = "https://example.com/api/data"
        val response = OkHttpClient().newCall(Request.Builder().url(url).build()).execute()
        return response.body()?.string() ?: ""
    }

    private fun updateWidgetViews(
        context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray, data: String
    ) {
    
    
        for (appWidgetId in appWidgetIds) {
    
    
            val views = RemoteViews(context.packageName, R.layout.my_widget_layout)

            // 更新微件视图中显示的数据
            views.setTextViewText(R.id.widget_text, data)

            appWidgetManager.updateAppWidget(appWidgetId, views)
        }
    }

En el ejemplo anterior, la función makeNetworkRequest() utiliza OkHttp para iniciar una solicitud de red y devuelve el resultado de la solicitud. En la función updateWidgetViews(), la vista del widget se actualiza a través del objeto RemoteViews y el resultado de la solicitud de red se muestra en el widget.

Tenga en cuenta que para realizar solicitudes de red es posible que sea necesario declarar un permiso de red () en el archivo AndroidManifest.xml.

Asegúrese de manejar la lógica asincrónica de las solicitudes de red al realizar solicitudes de red en los widgets, para no bloquear el hilo principal y afectar la experiencia del usuario.

3. ¿Compartes datos con la App?

Sí, los widgets pueden compartir datos con aplicaciones. Android ofrece una variedad de formas de compartir datos entre el widget y la aplicación.

A continuación se muestran algunos métodos comunes para compartir datos:

  1. ContentProvider: a través de ContentProvider, puede exponer datos en la aplicación y usar ContentResolver en el widget para leer y actualizar estos datos. ContentProvider proporciona una interfaz de acceso a datos estándar que se puede utilizar para lograr el intercambio de datos entre procesos.

  2. SharedPreferences: SharedPreferences es un mecanismo de almacenamiento liviano que se puede usar para compartir pares clave-valor simples entre aplicaciones y widgets. Tanto la aplicación como el widget pueden usar el mismo archivo SharedPreferences para leer y escribir.

  3. Compartir archivos: las aplicaciones y los widgets pueden compartir datos leyendo y escribiendo datos en archivos compartidos. Por ejemplo, una aplicación puede escribir datos en un archivo y un widget puede leer el mismo archivo para obtener datos.

  4. Transmisión: la aplicación puede notificar al widget que actualice los datos enviando una transmisión. El widget puede registrar el receptor de transmisión correspondiente, recibir la transmisión enviada desde la aplicación y actualizar los datos de acuerdo con el contenido de la transmisión recibida.

  5. Intención: una aplicación puede utilizar una intención para enviar una transmisión que contenga datos o para iniciar un servicio o actividad con datos adicionales. El widget puede usar el mismo Intent para obtener estos datos.

Estos métodos pueden elegir un método adecuado según sus necesidades y situaciones específicas para realizar el intercambio de datos entre el widget y la aplicación. El método de implementación específico depende de la arquitectura de su aplicación y de la complejidad de la transmisión de datos.

4. API

En Android, los widgets son AppWidgetProvidercreados por clases que heredan de la clase. Esta clase define algunos métodos importantes para manejar el ciclo de vida y los eventos del widget. A continuación se muestran algunos métodos importantes que se utilizan comúnmente:

  1. onUpdate(): Este método se llama cuando es necesario actualizar el widget. En este método, puede actualizar la vista y el contenido del widget. Este método se llama cuando se crea una instancia de widget, cuando el widget se agrega a la pantalla o cuando llega el ciclo de actualización del widget.

  2. onEnabled(): Este método se llama cuando se agrega la primera instancia del widget a la pantalla. Aquí puede realizar algunas operaciones de inicialización, como iniciar un servicio en segundo plano o configurar actualizaciones periódicas.

  3. onDisabled(): Este método se llama cuando la última instancia del widget se elimina de la pantalla. Aquí puede realizar algunas operaciones de limpieza, como detener servicios en segundo plano o borrar actualizaciones periódicas.

  4. onDeleted(): Este método se llama cuando la instancia del widget se elimina de la pantalla. Puede realizar algunas operaciones de limpieza para instancias de widgets específicas aquí.

  5. onReceive(): Este método se llama cuando se recibe un evento de transmisión desde el widget. Puede manejar el evento de clic del widget u otros eventos de transmisión personalizados aquí.

  6. onAppWidgetOptionsChanged(): Este método se llama cuando el tamaño del widget u otras opciones cambian. Aquí puede reorganizar y actualizar el widget según el nuevo tamaño u opciones.

  7. onRestored(): Este método se llama cuando el widget se vuelve a crear desde una copia de seguridad o restauración. Puede realizar operaciones de recuperación específicas aquí, como recargar datos previamente guardados.

  8. onAppWidgetRemoved(): Este método se llama cuando la instancia del widget se elimina de la pantalla y el sistema la elimina por completo. Puede realizar algunas operaciones de limpieza finales aquí.

  9. onAppWidgetOptionsChanged(): Este método se llama cuando se cambian las opciones de la instancia del widget. Las opciones se pasan mediante el método AppWidgetManageren . updateAppWidgetOptions()Aquí puede reorganizar y actualizar el widget según las nuevas opciones.

Estos métodos se AppWidgetProviderreescriben en la clase, puede implementar estos métodos según sea necesario y escribir una lógica personalizada en ellos para manejar el ciclo de vida y los eventos del widget.

Tenga en cuenta que no debe realizar operaciones que consuman mucho tiempo ni bloquear el hilo principal en estos métodos, porque las actualizaciones de widgets y el manejo de eventos se realizan en el hilo principal. Si necesita realizar solicitudes de red u otras operaciones que requieren mucho tiempo, se recomienda utilizar subprocesos en segundo plano o tareas asincrónicas para realizarlas.

Guess you like

Origin blog.csdn.net/weixin_35691921/article/details/131182266