Android学习之App Widgets
AppWidget
AppWidget一AppWidget 简介AppWidget指应用程序窗口小部件,是微小的应用程序视图,可以嵌入到其他的应用程序(通常指桌面(Home Screen))中并接收周期性的更新。
AppWidgets只是应用程序窗口小部件,但在Android 4.0 中被作为一个很重要的特征充分地展现出来了,用一个Tab页单独表示所有已安装的widgets。
如图1:图1 Google内置的Widgets页面常见的Google内置的Widgets有:Browser、Calendar、Contacts、DeskClock、Email、Gallery、Music、Settings、QuickSearchBox等。
一个已经被添加到Launcher的AppWidget如图2所示,是一个Calender加载到桌面上之后显示的画面:图2 加载到桌面之后的Calender Widget对于某些特定的应用来说,比如股票软件、天气、时钟,能够方便快捷地得到实时信息是很有必要的,这就是Widgets的好处:可以加载到桌面上显示,并且周期性的更新。
二与AppWidget实现相关的一些基本类(1)AppWidgetProviderInfo作用:为AppWidget提供元数据,包括布局、更新频率等数据,该对象定义在XML文件当中, 以<appwidget-provider>做标签。
xml文件存放在/res/xml/下,如/res/xml/xxxx_widget_info.xml。
通常一个widget_info.xml文件里的内容有:与之对应,AppWidgetProviderInfo 类的属性有:minWidth和minHeight 属性的值指定了这个AppWidget 布局需要的最小区域。
minResizeWidth 和minResizeHeight 指定Widget 能被重新指定的最小的宽高,如果指定的值比minWidth 和minHeight 大或者指定的resizemode 不可用,这两个属性值就不起作用了。
转载一份关于appwidget很详细
转载⼀份关于appwidget很详细简介1 Android widgetAndroid widget 也称为桌⾯插件,其是android系统应⽤开发层⾯的⼀部分,但是⼜有特殊⽤途,⽽且会成为整个android系统的亮点。
Android中的AppWidget与google widget和中移动的widget并不是⼀个概念,这⾥的AppWidget只是把⼀个进程的控件嵌⼊到别外⼀个进程的窗⼝⾥的⼀种⽅法。
2 AppWidget Framework2.1 定义Android系统增加了AppWidget 框架,⽤以⽀持widget类型应⽤的开发。
AppWidget 框架主要由两个部件来组成:(1)AppWidgetService是框架的的核⼼类,是系统 service之⼀,它负责widgets的管理⼯作。
加载,删除,定时事件等都需要AppWidgetService的处理。
开机⾃启动的。
AppWidgetService存在的⽬的主要是解开AppWidgetProvider和AppWidgetHost之间的耦合。
如果AppWidgetProvider和AppWidgetHost的关系固定死了,AppWidget就⽆法在任意进程⾥显⽰了。
⽽有了AppWidgetService,AppWidgetProvider根本不需要知道⾃⼰的AppWidget在哪⾥显⽰了。
(2)AppWidgetManager 负责widget视图的实际更新以及相关管理。
2.2 AppWidget Framework的⼤致流程1. 编写⼀个widget(先不考虑后台服务以及⽤户管理界⾯等)实际是写⼀个事件监听类即⼀个BroadcastReceiver⼦类,当然框架已经提供了⼀个辅助类AppWidgetProvider,实现的类只要实现其⽅法即可,其中必须实现的⽅法是onUpdate ,其实就是⼀个定时事件,widget监听此事件另外就是规划好视图(layout),将此widget打包安装。
widget用户交互(android)
Android 妙招解决App Widget用户交互 2010年01月07日 07:28 【IT168技术】App Widget对于Android来说是非常强大的。
通过它,开发人员可以创建简单的控件,在主屏幕上或在任何程序中提供类似的主机托管功能。
在创建一主屏幕App Widget时,您学习了如何创建和配置一个App Widget。
这个简单的应用程序插件播放了一个由用户预先设定时间间隔的图像幻灯片。
但是,如果用户想改变这个时间间隔?如果他们想暂停幻灯片或立即跳到下一张图片他们该怎么做呢?在本文中,您将学习如何对App Widget增加用户控件来处理这些行为。
为了处理与App Widget的交互,必须执行下面的任务:1、为每个App Widget控件设置唯一的单击处理器。
2、这个单击处理器向注册接收器发送一个命令3、处理收到的命令并执行任何必要行动4、更新App Widget,以反映变化在这个例子中,我们将修改之前文章所创建的App Widget(图1,顶上的App Widget ),包括一个带有三个控件的按钮栏(图1,底部App Widget)。
按钮栏上的每个按钮将执行一项具体的行动,然后点击App Widget的任何地方将隐藏按钮栏。
左边的按钮(工具集)将启动配置活动,用户可以改变幻灯片图像转换之间的时间间隔。
中间的按钮将暂停或恢复,幻灯片。
右侧的按钮,允许用户立即跳到下一张图片。
Figure 1: App Widget的三个不同状态Working with RemoteViews一个App Widget使用一种叫做RemoteViews的特殊的显示控件。
与普通视图不同的是,设计RemoteViews控件的目的是显示另一个进程中的视图控件的集合。
因此,不能简单地添加一个按钮处理程序,因为该代码将在应用程序的进程中运行,而不是在显示RemoteViews 对象的进程中(在这种情况下,主屏幕的进程中)。
Android开发之AppWidget详解
Android开发之AppWidget详解Android通知系统是它的⼀⼤特⾊,⽽其中,AppWidget是其中⼀个亮点。
在开发应⽤的中,很多时候可以为其添加⼀个AppWidget显⽰在桌⾯中,及时⽅便的与⽤户进⾏交互。
这⾥就简单的熟悉⼀下开发⼀个AppWidget的流程吧。
想要在应⽤中创建⼀个AppWidget,⾄少需要以下⼏样东西:1. 需要创建⼀个AppWidgetProviderInfo,来描述AppWidget的元数据。
2. 需要实现⼀个⾃⼰的AppWidgetProvider对AppWidget进⾏更新等操作。
3. 需要布局⽂件来描述AppWidget的布局。
那么,下⾯就开始创建⼀个AppWidget吧。
⼀、在AndroidManifest.xml中声明⼀个AppWidget⾸先我们需要在AndroidManifest.xml中声明AppWidgetProvider。
格式如下:<receiver android:name="MyAppWidgetProvider" ><intent-filter><action android:name="android.appwidget.action.APPWIDGET_UPDATE" /></intent-filter><meta-data android:name="android.appwidget.provider"android:resource="@xml/my_appwidget_info" /></receiver>可以看出AppWidgetProvider实际上就是⼀个BroadcastReceiver,它接收特定的Broadcast。
<meta-data>标签描述了AppWidget所使⽤的元数据,android:resource则声明了定义元数据的xml⽂件的位置。
widget
if (FRESH.equals(action)){
showTime(context);
}elseif(Intent.ACTION_TIME_TICK.equals(action)){
showTime(context);
}
super.onReceive(context,intent);
super.onUpdate(context,appWidgetManager, appWidgetIds);
mContext = context;
RemoteViews views = newRemoteViews(context.getPackageName(),yout.main);
} catch (InterruptedException e) {
e.printStackTrace();
}
mContext.sendBroadcast(newIntent(FRESH));//通知刷新Widget的Intent
}
};
};
@Override
import android.widget.RemoteViews;
public class TestAppWidget extends AppWidgetProvider {
private String tag="--------TestAppWidget";
private static
public void onUpdate(Contextcontext, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {//这个是每次Widget更新时调用的函数
AppWidget的使用详解(1)
AppWidget就是HomeScreen上显示的小部件,提供直观的交互操作。
通过在HomeScreen中长按,在弹出的对话框中选择Widget部件来进行创建,长按部件后并拖动到垃圾箱里进行删除。
同一个Widget部件可以同时创建多个。
而初学者对这不是很了解,包括我自己;我也是在学习这个学习了很长时间,因为我自己在做的时候,遇到了各种各样的问题。
下面是我自己通过很长时间学习的总结以及我在这个过程中遇到的问题,我也会写下来:1.首先需要提供一个定义了Widget界面布局的XML文件(位于res/layout/..),需要注意的是使用的组件必须是RemoteViews所支持的,目前原生API中支持的组件如下:FrameLayout LinearLayout R elativeLayoutAnalogClock Button Chronmeter ImageButton ImageView ProgressBar TextViewExample_widget.xml:<?xml version="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android" android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/widgetTextid"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="Frist_Widget"android:background="#000000"/></LinearLayout>2.然后我们要在res目录下,新建一个xml目录,在xml目录下,新建一个.xml文件例如:我在下面,新建一个xxx.xml,然后在类型选择AppWidget ProviderXxx.xml:<?xml version="1.0"encoding="utf-8"?><appwidget-providerxmlns:android="/apk/res/android" android:minWidth="294dp"android:minHeight="72dp"android:updatePeriodMillis="86400000"android:initialLayout="@layout/example_widget"></appwidget-provider>4.新建一个类,这个类继承AppWidgetProvider(注意:这里是新建一个类,不是在本身的Activity类继承AppWidgetProvider),AppWidgetProvider实际上就是一个BroadcastReceiver,要继承以下的函数:onReceive(Context, Intent)onUpdate(Context , AppWidgetManager, int[] appWidgetIds)onEnabled(Context)onDeleted(Context, int[] appWidgetIds)onDisabled(Context)Example.java:import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.Context;import android.content.Intent;public class Example extends AppWidgetProvider {@Overridepublic void onDeleted(Context context, int[] appWidgetIds) { // TODO Auto-generated method stubsuper.onDeleted(context, appWidgetIds);}@Overridepublic void onDisabled(Context context) {// TODO Auto-generated method stubsuper.onDisabled(context);}@Overridepublic void onEnabled(Context context) {// TODO Auto-generated method stubsuper.onEnabled(context);}@Overridepublic void onReceive(Context context, Intent intent) { // TODO Auto-generated method stubsuper.onReceive(context, intent);}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {// TODO Auto-generated method stubsuper.onUpdate(context, appWidgetManager, appWidgetIds);}}5.Activity类,什么事都可以不做AppWidgetActivity.java:import android.app.Activity;import android.os.Bundle;public class AppWidgetActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);}}6.我们前面说了,AppWidgetProvider实际上就是一个BroadcastReceiver;那我们在前面学BroadcastReceiver的时候,是不是要在AndroidManifest.xml中声明一个Receiver。
Android之窗口小部件详解--AppWidget
Android之窗⼝⼩部件详解--AppWidgetAndroid 之窗⼝⼩部件详解--App Widget版本号说明作者⽇期1.0 添加App Widge介绍和⽰例2013/06/271 App Widget简介App Widget是应⽤程序窗⼝⼩部件(Widget)是微型的应⽤程序视图,它可以被嵌⼊到其它应⽤程序中(⽐如桌⾯)并接收周期性的更新。
你可以通过⼀个App Widget Provider来发布⼀个Widget。
本⽂参考,先介绍App Widget的主要组件,然后再以⽰例来详细说明。
2 App Widget主要的相关类介绍2.1 AppWidgetProvider继承⾃ BroadcastReceiver,它能接收 widget 相关的⼴播,例如 widget 的更新、删除、开启和禁⽤等。
AppWidgetProvider中的⼴播处理函数如下:onUpdate()当 widget 更新时被执⾏。
同样,当⽤户⾸次添加 widget 时,onUpdate() 也会被调⽤,这样 widget 就能进⾏必要的设置⼯作(如果需要的话) 。
但是,如果定义了 widget 的 configure属性(即android:config,后⾯会介绍),那么当⽤户⾸次添加 widget 时,onUpdate()不会被调⽤;之后更新 widget 时,onUpdate才会被调⽤。
onAppWidgetOptionsChanged()当 widget 被初次添加或者当 widget 的⼤⼩被改变时,执⾏onAppWidgetOptionsChanged()。
你可以在该函数中,根据 widget 的⼤⼩来显⽰/隐藏某些内容。
可以通过 getAppWidgetOptions() 来返回 Bundle 对象以读取 widget 的⼤⼩信息,Bundle中包括以下信息:OPTION_APPWIDGET_MIN_WIDTH -- 包含 widget 当前宽度的下限,以dp为单位。
AppWidget控件入门详解
AppWidget控件⼊门详解AndroidUI组件----AppWidget控件⼊门详解我们可以把Widget理解成放置在桌⾯上的⼩组件(挂件),有了Widget,我们可以很⽅便地直接在桌⾯上进⾏各种操作,例如播放⾳乐。
当我们长按桌⾯时,可以看到Widget选项,图所⽰:点击上图中箭头处的widgets图标,会出现如下界⾯:(都是widget)长按上图中的任意⼀个widget,就可以将其放到桌⾯上。
Widget的使⽤Widget的实现思路(1)在AndroidManifest中声明AppWidget;(2)在xml⽬录中定义AppWidget的配置⽂件;(3)在layout⽬录中定义Widget的布局⽂件;(4)新建⼀个类,继承AppWidgetProvider类,实现具体的widget业务逻辑。
我们需要新建⼀个类,继承AppWidgetProvider。
点开AppWidgetProvider,发现AppWidgetProvider竟然是继承⾃BroadcastReceiver。
为什么Widget是⼀个⼴播接收器呢?我们知道,BroadcastReceiver类中有⼀个onReceive⽅法,⽤来接收⼴播。
当我们在桌⾯挂件上去做操作时,必然引起应⽤的改变,这就涉及到挂件和应⽤之间的通信,此时⽤⼴播来通信是再好不过了。
Widget的具体使⽤步骤(1)新建⼀个类TestWidget.java,继承AppWidgetProvider:TestWidget.java:importandroid.appwidget.AppWidgetProvider;importandroid.content.Context;importandroid.content.Intent;/Createdbysmyhvaeon2016/9/7./publicclassTestWidgetextendsAppWidgetProvider{@OverridepublicvoidonReceive(Contextcontext,Intentintent){super.onReceive(context,intent);}}(2)因为Widget是⼀个⼴播接收器,所以我们需要在清单⽂件中注册:android:name="android.appwidget.provider"android:resource="@layout/widget_setting"/>04⾏:action是过滤条件,⽤来过滤⾏为,监测widget的更新。
《Android移动应用开发》使用App Widgets创建桌面应用
1 设计简单的桌面组件
AppWidgetProvider
示例
1 设计简单的桌面组件
声明App Widgets
方法
在AndroidManifest.xml文件中声明该AppWidgetProvider类 <receiver> 元 素 的 android:name 属 性 必 须 要 进 行 设 置 , 该 属 性 说 明 了 将 使 用 哪 个
2 配置和管理桌面组件
Configuration Activity
注意
通过App Widgets Host调用Configuration Activity时,应该总是能返回一个执行结果。返 回结果应该包含通过Intent传给Configuration Activity的要添加的App Widgets的ID(该 ID通过EXTRA_APPWIDGET_ID保存在Intent的extras中)。
①通过setRemoteAdapter来设置RemoteViews对应RemoteViewsService。 ②在RemoteViewsService中,实现RemoteViewsFactory接口。然后,在
RemoteViewsFactory接口中对Collection Views的各个子项进行设置。
如 果 App Widgets 有 Configuration Activity , 那 么 当 App Widgets 被 创 建 时 , AppWidgetProvider的onUpdate()方法将不会被调用。当App Widgets被创建的时候, Configuration Activity必须负责请求AppWidgetManager对App Widgets进行首次更新 。然而以后只要更新时间到了,系统还是会发送ACTION_APPWIDGET_UPDATE广播,因此 App Widgets的onUpdate()方法还是会被调用,以进行App Widgets更新。系统只是在 App Widgets被创建的时候,不发送ACTION_APPWIDGET_UPDATE广播。
Android-Widget桌面小组件
Android-Widget桌⾯⼩组件1,掌握Widget的⽤:Widget的⽤途,能够添加到⼿机桌⾯的程序2,Widget的特点和⽤法步骤:特点:快捷,⽅便,个性化,可⾃定义功能,可及时控制更新Widget显⽰内容3,⽤法步骤流程图1. 绘制Widget布局2. 配置Widget的基本属性3. 定义AppWidgetProvider4. 提供Configuration Activity4,Android Widget实现⼀个基础的时钟功能效果:可以⾃动更新时间可以添加和删除时钟Widget5,完整代码:package com.example.widget;import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.Context;import android.content.Intent;import android.widget.RemoteViews;/*** 类似⼴播,是桌⾯⼩组件Widget的Provider*/public class widget extends AppWidgetProvider {static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,int appWidgetId) {CharSequence widgetText = context.getString(R.string.appwidget_text);// Construct the RemoteViews objectRemoteViews views = new RemoteViews(context.getPackageName(), yout.widget);views.setTextViewText(, widgetText);// Instruct the widget manager to update the widgetappWidgetManager.updateAppWidget(appWidgetId, views);}//刷新widget的时候执⾏,remoteView和AppWidgetManager@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {// There may be multiple widgets active, so update all of themfor (int appWidgetId : appWidgetIds) {updateAppWidget(context, appWidgetManager, appWidgetId);}}//第⼀个widget添加到屏幕上执⾏@Overridepublic void onEnabled(Context context) {// Enter relevant functionality for when the first widget is createdsuper.onEnabled(context);//启动Servicecontext.startService(new Intent(context, TimerService.class));}//最后⼀个widget被从屏幕移除执⾏@Overridepublic void onDisabled(Context context) {// Enter relevant functionality for when the last widget is disabledsuper.onDisabled(context);context.stopService(new Intent(context, TimerService.class));}//Widget被从屏幕移除@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {super.onDeleted(context, appWidgetIds);}//这个⽅法⼀般不会重写,⽆论操作中间(上⾯)的哪些⽅法,都会执⾏onReceive@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);}} service:package com.example.widget;import android.app.Service;import android.appwidget.AppWidgetManager;import ponentName;import android.content.Intent;import android.os.IBinder;import android.widget.RemoteViews;import androidx.annotation.Nullable;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Timer;import java.util.TimerTask;public class TimerService extends Service {//java.util.Timer下的定时器private Timer timer;private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {updateViews();}}, 0, 1000);}private void updateViews() {String time = sdf.format(new Date());RemoteViews rv = new RemoteViews(getPackageName(), yout.widget);rv.setTextViewText(, "黄朝阳666 : " + time);AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext()); ComponentName cn = new ComponentName(getApplicationContext(), widget.class);manager.updateAppWidget(cn, rv);}@Overridepublic void onDestroy() {super.onDestroy();timer = null;}}6,添加和删除天⽓Widget:7,8,。
App Widget的更新方法介绍
App Widget的更新方法介绍Widget是一种小巧但是功能强大的程序,使用户能够方便快捷的获取信息,在PC上被广泛的使用,现在随着OPhone的推出,widget也进入到了手机领域,为用户带来了方便的同时也为开发者实现更多很酷想法的可能。
在OPhone中有两种 widget开发方式,一种是以HTML+CSS+JavaScript的开发方式,另一种是沿用Android平台的开发方式,本文介绍的是后面一种,在OPhone平台上开发App widget。
widget一般开发方式介绍下面以编写一个时钟的小程序来介绍如何编写widget。
(1)创建一个类,让其继承类AppWidgetProvider,在AppWidgetProvider类中有许多的方法,例如 onDelete(Context, int[]),onEnable(Context)等等,一般情况下我们纸需要重写onUpdate(Context, AppWidgetManager, int[])这个方法就可以了,这个方法是当触发器更新widget时候执行的操作。
(2)在项目的AndroidMenifest.xml文件中添加一个receiver标签,让其指向前面创建的AppWidgetProvider子类,内容如下:1.<receiver android:name="widget"2. android:label="@string/app_name"3. android:icon="@drawable/icon">4. <intent-filter>5. <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />6. </intent-filter>7. <meta-data android:name="android.appwidget.provider"8. android:resource="@xml/widget_setting" />9. </receiver>intent-filter中过滤了APPWIDGET_UPDATE事件,这个事件是由系统触发的更新事件,每个widget必须包含这个事件;meta-data标签描述的是widget的配置文件指向,该文件描述了widget的一些基本信息。
androidappwidget开发总结
androidappwidget开发总结Android AppWidget开发从MVC结构上来说,AppWidget是Launcher上的⼀个View,AppWidgetManager 是它的controller,client package(如com.baidu.searchbox)是它的model。
在client package中,AppWidgetProvider⽤来提供AppWidget的⽣命周期响应事件,AppWidgetProviderInfo⽤来提供AppWidget的初始layout id等信息,AppWidget Configuration⽤来提供AppWidget的配置界⾯。
AppWidgetManager通过它的updateAppWidget⽅法驱动AppWidget的View进⾏UI更新。
⽽AppWidget⼜通过RemoteViews 来获取client package提供的UI更新信息。
由于Launcher与client package通讯属于IPC,所以,⼀般都使⽤AlarmManager 来实现AppWidget的定期更新。
1AppWidgetProvider1.1本质:⼀个可以接收ACTION_APPWIDGET_UPDATE、ACTION_APPWIDGET_ENABLED、ACTION_APPWIDGET_DELETED 、以及ACTION_APPWIDGET_DISABLED的broadcast receiver。
这些action对应了AppWidget的更新通知和⽣命周期,即onUpdate、onEnabled、onDeleted、onDisabled。
使⽤⽅法:与其它静态静态注册的receiver⼀样,在manifest中添加声明,并在代码中定义。
1.2注意事项:1.manifest声明处必须显式添加接收ACTION_APPWIDGET_UPDATE的intentfilter,否则⽆法在widget列表中找到该widget。
Android Widget开发详解
Android Widget开发详解本文和大家重点学习一下Widget开发的概念,本例是为了实现一个手机Android平台的Widget开发,该Widget中的内容是根据输入账号从叽歪网站上获得得。
当然,这个过程需要叽歪的API,得到信息后进行处理并显示出来。
大体流程就是这样。
好了,进入第一步。
Android Widget开发系列(二)该叽歪账号是测试账号,用户名是“students”,密码是“111111”请不要擅自更改。
2.建立一个WidgetAndroidreference中有关于如何建立一个Widget的详细方法,这里简要说明一下,详情可以查看AndroidSDK中自带的reference。
要建立一个Widget开发程序,分为如下几个步骤:(1)创建一个类,让其继承类AppWidgetProvider,在AppWidgetProvider中有许多方法,例如onDelete(Context,int[]),onEnable(Context)等,但一般情况下我们只是覆写onUpdate(Context,AppWidgetManager,int[])方法。
在该方法中,我们启动后台服务的类,一般是启动Thread类或者Android中的Service类。
在该类中我们进行从服务器端获得数据并进行处理并在Widget中显示。
(2)在你的AndroidMenifest.xml中添加一个receiver标签,让其指向你的AppWidgetProvider子类。
内容如下:1<receiverandroid:name receiverandroid:name="JiwaiWidget"2android:label="@string/app_name"3android:icon="@drawable/jiwai">4<intent-filter>5<actionandroid:name actionandroid:name="android.appwidget.action.APPWID GET_UPDATE"/>6</intent-filter>7<meta-dataandroid:name8meta-dataandroid:name="android.appwidget.provider"9android:resource="@xml/info"/>10</receiver>对上面的代码进行解释:第一行指定该Widget开发的接收者是JiwaiWidget,即你建立的AppWidgetProvider子类;第二行指定该Widget的标签名称,值为value目录下string.xml中的app_name值;第三行指定该Widget开发的图标,值为drawable目录下jiwai图片;第四行-第六行是采用Android文档中提供的;第七行指定该Widget的描述者信息,该描述着中定义了Widget的相关信息,如该Widget 的宽度、长度、自动更新的间隔时间等信息,该描述位于xml目录下的info.xml中。
android4.0中实现AppWidget集合
android4.0中实现AppWidget集合1.准备appwidget的初始布局和预览视图等资源AppWidget集合应用时,需配置两种布局文件:一个用于集合view布局显示,一个用于集合view上条目的的布局显示注意:要设置empty views,以便匹配集合view的空状态,且该View必须是集合View(一般可为ListView、GridView、StackView或AdapterViewFlipper)的同级View2.在res/xml中创建AppWidgetProvid erInfo文件根标签为appwiget-provider,其属性要包括initialLayout、previewImage、autoAdvanceViewId 等,具体可参考后面的例子3.创建AppWidgetProvid er的实现子类,并在清单文件里面注册引用的元数据和监听的广播action清单文件中,需给该子类配置如下信息:action android:name="android.appwidget.action.APPWIDGET_UPDATE"元数据:android:name="android.appwidget.provider"代码中,onUpdate方法中完成Widget布局到桌面上时的刷新;onReceive方法中完成接收到特定广播后的Widget刷新(另外,如果配置了Configure Activity还需要注册action,"android.appwidget.action.APPWIDGET_CONFIGURE")4.因为是集合Widget,需要创建一个继承了RemoteViewsService的Service子类,并在清单文件中注册权限,阻止其它程序自由访问Widget中的数据android:permission="android.permission.BIND_REMOTEVIEWS"代码中通过onGetViewFactory方法返回一个RemoteViewsFactory的实现类,该实现类中的onCreate()用来创建及初始化设置Widget的单个item;getViewAt()方法用来同步数据,进行耗时的更新操作,并返回RemoteView对象。
Android学习之AppWidget创建步骤
AppWidget指应用程序窗口小部件,这些窗口小部件可以给用户提供一些方便快捷的操作。
下面我们来看看如何创建AppWidget:运行结果图:项目结构图:1、在res文件夹下新建一个名字为xml的文件夹,然后在xml目录下创建一个名为appwidget01的xml文件(如上图所示)。
这个appwidget01中的内容如下:1.<?xml version="1.0" encoding="utf-8"?>2.<appwidget-provider3. xmlns:android="/apk/res/android"4. android:minWidth = "294dp"5. android:minHeight = "72dp"6. android:updatePeriodMillis = "86400000"7. android:initialLayout = "@layout/appwidgetlayout"8. >9.</appwidget-provider>这个xml是用来描述你所要创建的appWidget的一些描述信息的,比如高度、宽度、刷新间隔、布局文件等等。
仅仅这个描述文件还不够,我们看到的appWidget可都是有界面元素的呀,比如说文本,图片,按钮等等,这些东西的定义都需要放到layout文件夹下面。
这个文件就是上面代码中写到的那个appwidgetlayout。
2、在layout文件夹下面新建一个appwidgetlayout.xml文件,在这个文件中描述了appWidget的控件和布局等等信息,就和我们平常创建的一个activity的布局文件没什么两样,因为只是简单的演示,所以仅用一个文本和一个按钮。
xml的内容如下:1.2.<?xml version="1.0" encoding="utf-8"?>3.<LinearLayoutxmlns:android="/apk/res/android"4. android:layout_width="fill_parent"android:layout_height="fill_parent">5. <TextView android:id="@+id/txtapp" android:text="test"android:layout_width="wrap_content"6. android:layout_height="wrap_content"android:background="#ffffff"></TextView>7. <Button android:id="@+id/btnSend"android:layout_width="wrap_content"8. android:layout_height="wrap_content"android:text="Send"></Button>9.</LinearLayout>3、既然appWidget中存在按钮等等控件,那么就肯定少不了处理这些控件事件的处理代码啦。
9_Android基本组件之常用widget组件介绍(图片视图-PPT课件
© 2006, ZTE Corporation. All rights reserved.
图片视图(ImageView)介绍与应用
图片视图(ImageView)
© 2006, ZTE Corporation. All rights reserved.
这里现在main.xml中添加一个按钮,单击按钮会启动这个 ImageButtonActivity,添加Button的代码如下: <Button android:id="+id/image_button_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="哥显示的是图片按钮" />
© 2006, ZTE Corporation. All rights reserved.
图片视图(ImageView)介绍与应用
在单击按钮后,会启动一个新的ImageViewActivity,所以这里我们应 该创建一个新的ImageViewActivity.java文件。实现代码如下: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle("是办正事,还是找乐子~"); setContentView(yout.image_view); } 在上面代码我们可以看到,调用了一个image_view.xml的文件,所以, 我们要设计一下显示的多选框的样式,对应设计代码如下: <ImageView android:id="+id/imageview" android:src="drawable/mybaby" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
Android 桌面组件【widget】初探
Android 桌面组件【widget】初探2010-07-29 23:40 by Terry_龙, 1300 visits, 网摘, 收藏, 编辑本来打算晚上继续 Api Demos 系列的,不过今天下午的时候无聊去玩了一下桌面组件 App Widget 觉得挺不错的一个东西,对它很是感兴趣,玩了一下碰到很多问题,一直在解决问题到了晚上10点。
只能怪自己理解不深刻,不过最后还是解决了,把一些领悟写出来也算给自己一个交代。
下面是本篇的大纲:∙1、AppWidget 框架类∙2、在 Android 如何使用 Widget∙3、AppWidget 框架的主要类介绍∙4、DEMO 讲解1、AppWidget 框架类∙1、AppWidgetProvider :继承自 BroadcastRecevier ,在AppWidget 应用 update、enable、disable 和 delete 时接收通知。
其中,onUpdate、onReceive 是最常用到的方法,它们接收更新通知。
∙2、 AppWidgetProvderInfo:描述 AppWidget 的大小、更新频率和初始界面等信息,以XML 文件形式存在于应用的 res/xml/目录下。
∙3、AppWidgetManger :负责管理 AppWidget ,向 AppwidgetProvider 发送通知。
∙4、RemoteViews :一个可以在其他应用进程中运行的类,向AppWidgetProvider 发送通知。
2、在 Android 如何使用 Widget∙1、长按主界面∙2、之后弹出一个对话框,里面就有android 内置的一些桌面组件3、AppWidget 框架的主要类介绍1) AppWidgetManger类∙bindAppWidgetId(int appWidgetId, ComponentName provider) 通过给定的ComponentName 绑定appWidgetId∙getAppWidgetIds(ComponentName provider)通过给定的ComponentName 获取AppWidgetId∙getAppWidgetInfo(int appWidgetId)通过AppWidgetId 获取 AppWidget 信息∙getInstalledProviders()返回一个List<AppWidgetProviderInfo>的信息∙getInstance(Context context)获取 AppWidgetManger 实例使用的上下文对象∙updateAppWidget(int[] appWidgetIds, RemoteViews views) 通过appWidgetId 对传进来的 RemoteView 进行修改,并重新刷新AppWidget 组件∙updateAppWidget(ComponentName provider, RemoteViews views) 通过 ComponentName 对传进来的 RemoeteView 进行修改,并重新刷新AppWidget 组件∙updateAppWidget(int appWidgetId, RemoteViews views)通过appWidgetId 对传进来的 RemoteView 进行修改,并重新刷新AppWidget 组件2) 继承自 AppWidgetProvider 可实现的方法为如下:∙1、onDeleted(Context context, int[] appWidgetIds)∙2、onDisabled(Context context)∙3、onEnabled(Context context)∙4、onReceive(Context context, Intent intent)Tip:因为 AppWidgetProvider 是继承自BroadcastReceiver 所以可以重写onRecevie 方法,当然必须在后台注册Receiver∙5、onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)4、Demo讲解下面是我今天做的一个实例,提供给大家练习时做参考,效果如下:在布局中放一个 TextView 做桌面组件,然后设置TextView 的 Clickable="true" 使其有点击的功能,然后我们点击它时改变它的字体,再点击时变回来,详细操作如下流程:∙1、新建AppWidgetProvderInfo∙2、写一个类继承自AppWidgetProvider∙3、后台注册Receiver∙4、使 AppWidget 组件支持点击事件∙5、如何使TextView 在两种文本间来回跳转问题抛出来了,那么一起解决它吧。
15.1 AppWidgets相关知识_Android移动开发案例详解_[共6页]
15.1 AppWidgets相关知识15.1.1 AppWidgets简介跟SDK1.1相比较,SDK1.5提供的功能更加强大。
不仅增加了软键盘、人脸识别、语音识别、桌面AppWidgets等让开发者和用户激动无比的功能,而且增加了NDK这个原生态的软件支持C++/C编写,让那些C/C++高手在Android上的开发有了用武之地。
而AppWidgets 框架的加入无疑使原本单调不已的Android桌面“蓬荜生辉”。
这个框架允许开发者开发出能与桌面交互的AppWidgets,比如在桌面上放一个音乐播放器,或者放一个日历,或是放一个天气预报的AppWidgets。
本章就针对这一新特性详细讲解如何利用SDK1.5提供的API开发自己的AppWidgets。
15.1.2 HelloWidget范例记得我们当初学程序语言的时候习惯从HelloWorld开始,以便快速地入门。
下面也同样以HelloWidget开始AppWidgets开发之旅。
首先要学会怎样将一个写好的AppWidgets放到桌面上,AppWidgets不同于一般的Activity,在Android上安装后,在程序的显示栏中无法找到你做好的AppWidgets,所以刚开始的时候很多人会很奇怪怎么找不到安装好的AppWidgets。
如图15-1所示,按下Menu 按钮,会弹出一个菜单让你选择。
选“Widgets”选项,会进入到如图15-2所示的界面。
图15-1 从Menu菜单中添加Widgets 图15-2 所有可添加Widgets的列表如果我们的AppWidgets安装成功的话,在这个列表中可以看到我们的AppWidgets,选中后便将我们的AppWidgets添加到桌面(如果在AppWidgets中添加了配置的Activity的话会先进入到配置的Activity中,下面会介绍)。
图15-3便是运行HelloWidget的结果,在屏幕上简单地输出一句话。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
需要定义一个AppWidgetProvider的子类,并覆盖其中的某些方法来控制自己的AppWidget
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "Receive");
if (intent.getAction().equals(broadCastString))
{
//只能通过远程对象来设置appwidget中的控件状态
RemoteViews remoteViews = new
RemoteViews(context.getPackageName(),yout.second);
//进行控件的修改,比如图片等
remoteViews.setTextViewText(R.id.txt, "修改后信息");
//获得appwidget管理实例,用于管理appwidget以便进行更新操作AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
//相当于获得所有本程序创建的appwidget
ComponentName componentName = new
ComponentName(context,ExampleAppWidgetProvider.class);
//更新appwidget
appWidgetManager.updateAppWidget(componentName, remoteViews);
Log.i(TAG, "OK");
}
super.onReceive(context, intent);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
Log.i(TAG, "Update");
for (int i = 0; i < appWidgetIds.length; i++)
{
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendingIntent =
PendingIntent.getActivity(context, 0, intent, 0);
RemoteViews views = new
RemoteViews(context.getPackageName(), yout.second);
views.setOnClickPendingIntent(R.id.btn, pendingIntent);
Intent intent2 = new Intent();
intent2.setAction(broadCastString);
PendingIntent pendingIntent2 =
PendingIntent.getBroadcast(context, 0, intent2, 0);
views.setOnClickPendingIntent(R.id.broadcast, pendingIntent2);
appWidgetManager.updateAppWidget(appWidgetIds[i], views);//更新以确定添加了响应
Log.i(TAG, "Length:"+ appWidgetIds.length+ ";I="+ i);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
生命周期:
创建第一个时:
onReceive → onEnabled → onReceive → onUpdate 创建非第一个时:
onReceive → onUpdate
删除非最后一个时:
onReceive → onDelete
删除最后一个时:
onReceive → onDelete → onReceive → onDisable。