Timmmm,
Su problema es que usted está buscando para el objeto equivocado. Realmente no puedes controlar el AppWidgetManager
. No es tu trabajo, es el del Sistema. Lo que PUEDE hacer es controlar un AppWidgetHost
, solo requiere algunas semánticas. Aquí están los básicos.
EDIT: Antecedentes adicional en el proceso de encuadernación Widget
El AppWidgetManager es un objeto único que se ejecuta cuando se inicia el sistema. Esto significa que cada instancia de cada iniciador utiliza el mismo AppWidgetManager. Lo que los diferencia es su AppWidgetHost y las RemoteViews que actualmente tienen. El AppWidgetManager básicamente mantiene una lista de todos los hosts activos y los widgets que tienen. Un AppWidgetHost no es un objeto privilegiado. Es decir, cualquier actividad puede tener un solo host. Por lo tanto, una aplicación completa puede ser nada más que Widgets, si así lo desean.
Cuando crea una instancia del host, debe agregarle vistas. Entonces, básicamente es una lista de Vistas secundarias sin límites parentales obligatorios, excepto lo que su Actividad le dé. Primero, solicite una identificación (a través del myHost.allocateAppWidgetId()
). Luego usa su actividad/cuadro de diálogo Seleccionar widget. El Diálogo devuelve el WidgetInfo. La Vista se recupera cuando le solicita al Anfitrión que cree la Vista (a través del createView
) con el WidgetInfo y la ID que solicitó. Luego le pregunta al widget por su RemoteView
.
Finalmente, vincula el widget al colocar la Vista en su Actividad como un Niño. Esto se realiza mediante el método addView() del ViewGroup
que contiene todos sus widgets.
El proceso en acción (editado)
En primer lugar, usted tiene que asegurarse de que tiene esto en su manifiesto de Android:
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
A continuación, usted tiene que crear una AppWidgetHost
(extiendo el mío para mi lanzador). La clave para el host es mantener una referencia al AppWidgetManager
a través del AppWidgetManager.getInstance();
.
AppWidgetHost myHost = new AppWidgetHost(context, SOME_NUMERICAL_CONSTANT_AS_AN_ID);
Ahora, obtener su ID:
myHost.allocateAppWidgetId()
El siguiente paso se lleva a cabo por cualquier método que se utiliza para obtener la información del widget. La mayoría de las veces se devuelve mediante una intención a través de onActivityResult. Ahora, todo lo que tienes que hacer es usar la appInfo y crear la vista. El WidgetId normalmente lo proporciona el resultado de actividad de widget de selección.
AppWidgetProviderInfo withWidgetInfo
= AppWidgetManager.getInstance().getAppWidgetInfo(forWidgetId);
AppWidgetHostView hostView
= myWidgetHost.createView(myContext, forWidgetId, withWidgetInfo);
hostView.setAppWidget(forWidgetId, withWidgetInfo);
Ahora solo enlaza la Vista como un niño a lo que quieras vincular.
myViewGroup.addView(hostView);
Por supuesto, siempre hay que tener en cuenta dónde y cómo colocarlo, etc Además, usted tiene que asegurarse de que su AppWidgetHost
es escuchar antes de empezar a añadir widgets.
myHost.startListening()
Para resumir
El proceso de unión Widget abarca muchos métodos y pasos, pero todo se produce a través de la AppWidgetHost
. Debido a que los widgets están codificados fuera de tu espacio de nombres, no tienes ningún control excepto por dónde los pones y cómo dimensionas la vista. Dado que en última instancia son códigos que se ejecutan en su espacio pero fuera de su control, el AppWidgetManager
actúa como un mediador neutral, mientras que el AppWidgetHost
actúa como facilitador en nombre de su aplicación. Una vez que esto se entiende, su tarea es simple. Los pasos anteriores son todos los pasos necesarios para cualquier iniciador personalizado (incluido el mío).
EDIT: Aclaración final
El ICS Launcher hace esto también. El appWidgetManager
que usan es solo un contenedor que contiene el AppWidgetHost
y las llamadas al AppWidgetManager
. Olvidé que muy poco de esto se explica en el sitio web de Android Development Central.
Espero que esto ayude! Avíseme si necesita más detalles.
FuzzicalLogic
Gracias por la respuesta, pero desafortunadamente no parece resolver mi problema: 1. Creo que su uso de BIND_APPWIDGET no tiene ningún efecto, porque las aplicaciones que no son del sistema no pueden obtener ese permiso (vea el enlace en mi pregunta). 2. Estoy usando mi propia "actividad de widget de selección", la que está integrada en el iniciador de ICS. Puede que no haya entendido bien, pero estoy empezando a pensar que esto es imposible. – Timmmm
Qué permisos se pueden dar depende de la ROM del teléfono/dispositivo. Por ejemplo, mi Samsung Moment me da ese permiso (no rooteado). Motorola Xoom (rooteado) no dará ese permiso, pero grita si no lo tengo. –
¿Wow realmente? ¡Eso es ridículo! Parece que se pretende que no se lo den. Gracias por responder de todos modos. – Timmmm