Android开发入门之Appwidget用法分析
作者:manymore13 发布时间:2023-10-26 12:04:46
本文实例讲述了Android Appwidget用法。分享给大家供大家参考,具体如下:
App Widgets 是一个小型应用程序的View 他可以嵌入到其他应用程序中(如 桌面程序) 并且可以得到周期性刷新。
在创建App Widget之前需要了解以下几个概念
AppWidgetProviderInfo对象
它是对App Widget 元数据的一个描述,譬如 AppWidget的布局,刷新频率,以及 AppWidgetProvider 类 这些元数据都是定义在XML中。
AppWidgetProvider 类的实现
对于App Widget定义了(回调接口)一些基本的方法,这些方法都是基于广播事件(broadcast events ),,通过它,当App Widget更新,创建,无效,卸载时,你可以接收广播。
View layout
为App Widget定义初始布局,用XML来布局
另外,你可以为App Widget 实现一个配置的Activity,这是一个可选择的Activity,在用户添加你的App Widget 准备创建时允许他修改或者配 置App Widget 。
下面我们就开始创建一个App Widget
① 在Manifest声明App Widget
首先,在AndroidManifest.xml中声明 AppWidgetProvider
<receiver android:name="ExampleAppWidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/example_appwidget_info" />
</receiver>
<receiver>元素需要Android:name 属性,AppWidgetProvider作为引用
<intent-filter> 元素务必要包含 <action>元素 然后Action中要有android:name 属性,这个属性需要指定能接收 ACTION_APPWIDGET_UPDATE 广播的AppWidgetProvider,也就是ExampleAppWidgetProvider 这个广播必须唯一 必须明确声明,因为AppWidgetManager会自动的发送所有其他应用程序的广播给AppWidgetProvider,所以很重要。
<meta-data> 元素指定AppWidgetProviderInfo资源需要以下属性
Android:name -指定了元数据的名字,用android.appwidget.provider代表数据是AppWidgetProviderInfo描述。
Android:resource -引用AppWidgetProviderInfo 资源的位置
总之一句话:在AndroidManifest.xml主要声明概念中AppWidgetProvider 和AppWidgetProviderInfo
②添加AppWidgetProviderInfo元数据
AppWidgetProviderInfo为AppWidgeet定义了一些最基本的数据,譬如布局的最小尺寸,初始化布局资源,怎样更新App Widget,以及在创建app Widget时的可配置Activity(可选)
要定义一个AppWidgetProviderInfo对象可以用XML资源文件定义,保存在res/xml/自己的文件名 ,XML文件中用一个单一的元素<appwidget-provider> 请看下面的例子:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="294dp"
android:minHeight="72dp"
android:updatePeriodMillis="86400000"
android:previewImage="@drawable/preview"
android:initialLayout="@layout/example_appwidget"
android:configure="com.example.android.ExampleAppWidgetConfigure"
android:resizeMode="horizontal|vertical">
</appwidget-provider>
initialLayout:指定App Widget布局资源文件
Configure:在创建App Widget时为他配置属性的activity
updatePeriodMillis: appwidget更新频率
③ 创建App Widget 布局
你必须为你的App Widget定义个初始化布局文件,可以将布局文件放在 res/layout/directory。 你可以设计你的App Widget用下面列出来
的View对象,但是在你设计开始之前,请你熟读App Widget Design Guidelines.
如果你熟悉XML Layouts ,那么创建一个App Widget将会是简单的, 然而,你必须意识到App Widget布局是基于 RemoteViews ,它并不是支持每一种layout和View widget。
一个RemoteView对象只能支持下面几种layout布局类:
FrameLayout LinearLayout RelativeLayout
支持下面几种widget 类:
AnalogClock Button Chronometer ImageButton ImageView ProgressBar TextView ViewFlipper ListView GridView
StackView AdapterViewFlipper
PS:这些类的继承类也是不被支持的。
下面是我本次写的demo中的Appwidget
功能很简单只为初步理解AppWidget ,响应Appwidget上按钮事件
package com.manymorere.appwidget;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
public class ExampleAppWidgetProvider extends AppWidgetProvider{
private static final String ACTION = "com.manymore.appwidget";
private int id;
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
System.out.println("onDeleted");
super.onDeleted(context, appWidgetIds);
}
@Override
public void onDisabled(Context context) {
// TODO Auto-generated method stub
System.out.println("onDisabled");
super.onDisabled(context);
}
@Override
public void onEnabled(Context context) {
// TODO Auto-generated method stub
System.out.println("onEnabled");
super.onEnabled(context);
}
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("onReceive");
// 自己定义的ACTION
if(intent.getAction().equals(ACTION))
{
RemoteViews remoteView = new RemoteViews(context.getPackageName(),R.layout.appwidget_layout);
remoteView.setCharSequence(R.id.button, "setText", "22222222222222");
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName componentName = new ComponentName(context, ExampleAppWidgetProvider.class);
appWidgetManager.updateAppWidget(componentName , remoteView);
System.out.println("收到自定义ACTION");
}else{
super.onReceive(context, intent);
}
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
int N = appWidgetIds.length;
for(int i = 0; i<N; i++)
{
int appWidgetId = appWidgetIds[i];
Intent intent = new Intent(ACTION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.appwidget_layout);
remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
System.out.println(appWidgetId);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
}
每次添加Appwidget实例 都会调用onUpdate()方法 然后会注册里面的Button Onclick事件,当你点击该按钮时会发送一个broadcast,这个broadcast是自己定义的,然后onReceive方法会收到该broadcast,然后再做出一些反应,我这里是把修改了TextView上的text。
由于Appwidget和本身的应用,虽然是在一个程序中,但运行时,它们并不是在一个进程中,所以在在调用方法和修改界面上多少会有点限制,没有普通的(Activity上对View的一些操作)那么自由,所以想对Appwidget上的View做一些操作,或者更新Appwidget,一般需要用到RemoteViews,AppWidgetManager 同时可能还会用到ComponentName
个人理解:RemoteViews在创建时主要代表一个Appwidget实例中View的一个集合 ,而ComponentName则代表一个整个Appwidget实例
完整实例代码点击此处本站下载。
希望本文所述对大家Android程序设计有所帮助。
猜你喜欢
- Java * 代理设计模式定义:为其他对象提供一种代理以控制对这个对象的访问。 * 使用java * 机制以巧妙的方式实现了代理模式的
- 我们在设计layout的时候,使用Split视图,就是左侧是代码,右侧是设计图,但是我们忽视了最上方的工具栏,这里才是真正的宝藏。下面教大家
- 引言当我们通过@ConfigurationProperties注解实现配置 bean的时候,如果默认的配置属性转换无法满足我们的需求的时候,
- 1. 通过字节流实现文件的拷贝 /** * 通过字节流实现文件的拷贝 * @param sourcePath 源
- JAVA是面向对象的语言,开发者在操作数据的时候,通常更习惯面对一个特定类型的对象,如一个用户就是一个User类的对象。DAO层需要做的,就
- 摘要:用spring-boot开发RESTful API非常的方便,在生产环境中,对发布的API增加授权保护是非常必要的。现在我们来看如何利
- 环境:eclipse + spring mvc + maven1、直接看图,把数据库的配置单独拿出来放在了resources_env目录下,
- 现在就为大家介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1、公钥加密,私钥解密;2、私钥加密,公钥解密。下面就为大家分析一
- @PropertySource加载自定义yml文件使用@PropertySource默认加载的是.xml或者 .properties文件,因
- 在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/lib的子目录,那里存放着各类第三方依赖jar文件
- 在实际开发中,我们经常会需要在页面跳转的时候携带路由参数,典型的例子就是从列表到详情页的时候,需要携带详情的 id,以便详情页获取对应的数据
- 前言大家好,我是bigsai,在数据结构与算法中,二叉树无论是考研、笔试都是非常高频的考点内容,在二叉树中,二叉树的遍历又是非常重要的知识点
- 一、前言原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与
- 数据适配DataAdapter 对象是DataSet 和数据源之间的桥梁,可以建立并初始化数据表(即DataTable),对数据源执行SQL
- 最近有个同事在调用一个类库中的方法时遇到了一个问题,异常信息如下:尝试释放正在使用的RCW,活动线程或其他线程上正在使用该 RCW,释放正在
- 本文实例为大家分享了C#实现学生档案查询的具体代码,供大家参考,具体内容如下using System;using System.Collec
- 一、封装的查询方法/*** solr查询方法* @param client solr客户端* @param query solr查询对象*
- java引用传递的三种类型我这里使用了mldn视频里的例子,只用于学习交流。第一种结果:调用前:50调用后:1000分析:理解:好理解第二种
- 一、前言程序界面上的按钮多种多样,常用的就这几种:普通按钮、图标按钮、文字按钮、图片文字混合按钮。本文章记录了不同样式类型的按钮实现方法。下
- 一、线程的生命周期1.五种状态:新建状态、就绪状态、运行状态、阻塞状态、消亡状态2.就绪状态的线程表示有权利去获取CPU的时间片,CPU时间