- 浏览: 926740 次
- 性别:
- 来自: 上海
最新评论
-
liu149339750:
我勒个去,搜到你的博客了,关注!
Android make脚本简记 -
ihopethatwell:
楼主,这个修改时间有个问题,退出修改界面就不保存设置的时间了, ...
Android中如何修改系统时间(应用程序获得系统权限) -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
taowayi:
推荐android一键反编译神器 apkdec
Android apk反编译
Android:AppWidget,PendingIntent,RemoteViews用法
- 博客分类:
- Android应用开发
什么是AppWidget?AppWidget就是我们平常在桌面上见到的那种一个个的小窗口,利用这个小窗口可以给用户提供一些方便快捷的操作。本篇打算从以下几个点来介绍AppWidget:
1.如何创建一个简单的AppWidget
2.如何使得AppWidget与客户端程序交互
下面我们来创建一个简单的AppWidget
1、定义AppWidgetProviderInfor:在res/xml文件夹中定义一个名为 :example_appwidget_info.xml,这个名字随便取。它是提供AppWidget元数据;设置在桌面上显示的大小
example_appwidget_info.xml
- < appwidget-provider xmlns:android = "http://schemas.android.com/apk/res/android"
- android:minWidth = "294dp"
- android:minHeight = "72dp"
- android:updatePeriodMillis = "86400000"
- android:initialLayout = "@layout/example_appwidget" >
- <!-- initiallayout设置引用 的布局文件 -->
- </ appwidget-provider >
2、为App Widget指定样式和布局;在桌面上显示的内容,布局,就像main.xml布局一样,做为example_appwidget_info.xml的 initialLayout参数的值,用这个布局文件来初始化example_appwidget_info.xml。
- <?xml version= "1.0" encoding= "utf-8" ?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:id="@+id/widgetTextId"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="firstWidgetText"
- android:background="#000000"
- />
- </LinearLayout>
3、实现继承AppWidgetProvider这个类;
这个类有五个方法:都需要继承:(下面按照当第一次加载Widget到删除的时候,这些方法运行的顺序)
1、onReceive
(Context
context, Intent
intent)
Implements onReceive(Context,
Intent)
to dispatch calls to the various other methods on AppWidgetProvider.
2、onEnabled
(Context
context)
Called in response to the ACTION_APPWIDGET_ENABLED
broadcast
when the a AppWidget for this provider is instantiated. Override this method to implement your own AppWidget functionality.
3、onUpdate
(Context
context, AppWidgetManager
appWidgetManager,
int[] appWidgetIds) Called in response to the ACTION_APPWIDGET_UPDATE
broadcast
when this AppWidget provider is being asked to provide RemoteViews
for
a set of AppWidgets. Override this method to implement your own AppWidget functionality.
4、onDeleted
(Context
context,
int[] appWidgetIds) Called in response to the ACTION_APPWIDGET_DELETED
broadcast
when one or more AppWidget instances have been deleted. Override this method to implement your own AppWidget functionality.
5、onDisabled
(Context
context)
Called in response to the ACTION_APPWIDGET_DISABLED
broadcast,
which is sent when the last AppWidget instance for this provider is
deleted. Override this method to implement your own AppWidget
functionality.
基中onReceive负责进行接受广播,控制运行哪一个函数,每一个操作都会首先运行这个方法,再调用其它的方法。所以在Widget一次加载到删除过程中,onReceive会执行4次;
如下图:注意message
下面看代码: ExampleAppWidgetProvider.java
- public class ExampleAppWidgetProvider extends AppWidgetProvider {
- @Override
- public void onUpdate(Context context, AppWidgetManager appWidgetManager,
- int [] appWidgetIds) {
- System.out.println("onupdate" );
- super .onUpdate(context, appWidgetManager, appWidgetIds);
- }
- @Override
- public void onDeleted(Context context, int [] appWidgetIds) {
- System.out.println("onDeleted" );
- super .onDeleted(context, appWidgetIds);
- }
- @Override
- public void onDisabled(Context context) {
- System.out.println("onDisabled" );
- super .onDisabled(context);
- }
- @Override
- public void onEnabled(Context context) {
- System.out.println("onEnabled" );
- super .onEnabled(context);
- }
- }
在这个实例中,因为与Activity脱离关系,所以Activity不用更改,只是在应用系统中注册了一个与这个应用程序相关的AppWidget而已:结果:
下面再来看看如何在AppWidget中添加按钮,添加监听事件。
1、在example_appwidget_info.xml文件里添加Button迫使
2、添加TargetActivity
只是用来响应点击事件,在此例中没有实际意义
- public class TargetActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super .onCreate(savedInstanceState);
- setContentView(R.layout.main);
- }
- }
3、在AndroidManifest.xml文件注册TargetActivity
4、重写ExampleAppWidgetProvider类的onUpdate方法,在第一次创建WidGet的时候,向按钮添加监听。并用PendingIntent,和RemoteView两个类,对事件进行处理;
- public void onUpdate(Context context, AppWidgetManager appWidgetManager,
- int [] appWidgetIds) {
- System.out.println("onupdated" );
- for ( int i = 0 ; i <appWidgetIds.length; i++) {
- System.out.println(appWidgetIds[i]);
- //创建一个Intent对象
- Intent intent = new Intent(context,TargetActivity. class );
- //创建一个PendingIntent(有四种方法获取)
- PendingIntent pendingIntent = PendingIntent.getActivity(context, 0 , intent, 0 );
- RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.example_appwidget);
- //为按钮绑定事件处理器
- //第一个参数用来指定被绑定处理器的控件的ID
- //第二个参数用来指定当事件发生时,哪个PendingIntent将会被执行
- remoteViews.setOnClickPendingIntent(R.id.widgetButton, pendingIntent);
- //更新AppWidget
- //第一个参数用于指定被更新AppWidget的ID
- appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
- }
- super .onUpdate(context, appWidgetManager, appWidgetIds);
- }
Called in response to the ACTION_APPWIDGET_DELETED
broadcast
when one or more AppWidget instances have been deleted. Override this method to implement your own AppWidget functionality.
在实际应用在AppWidget更多的是利用广播机制Action进行处理的;下面我们来看看如何利用广播机制,单击改变AppWidget的内容;在上例 的基础上进行扩展:
1、AppWidget的布局文件:widget01.xml
- <? xml version = "1.0" encoding = "utf-8" ?>
- < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
- android:orientation = "vertical"
- android:layout_width = "fill_parent"
- android:layout_height = "fill_parent"
- >
- < Button android:id = "@+id/widgetButton"
- android:layout_width = "fill_parent"
- android:layout_height = "wrap_content"
- android:text = "@string/widget_button" />
- < TextView android:id = "@+id/test_text"
- android:layout_width = "fill_parent"
- android:layout_height = "wrap_content"
- android:text = "@string/test_text"
- android:gravity = "center"
- android:textColor = "#fff" />
- </ LinearLayout >
其中的Button控件是测试按钮,TextView用来反应单击Button之后显示的内容变化;(这是给Button添加监听器,再利用Action广播。收onRecerve接收,做出动作)
2、修改AndroidManifest.xml
在Reservi里添加action,注册事件
- < receiver android:name = "ExampleAppWidgetProvider" > <!--如果action匹配成功,就在此类中进行处理-->
- < intent-filter >
- <!--利用广播机制接收,onUpdate会接收广播。查看源码可收得知 Called in response to the ACTION_APPWIDGET_UPDATE
- broadcast when this AppWidget provider is being asked to provide RemoteViews
- for a set of AppWidgets. Override this method to implement your own AppWidget
- functionality. 这个也必须要,不然onRecerve不会调用 。-->
- <!--这是自定义的Action事件--> < action android:name = "android.appwidget.action.APPWIDGET_UPDATE" />
- < action android:name = "learn.test.UPDATE_APP_WIDGET" />
- </ intent-filter >
- < meta-data android:name = "android.appwidget.provider" android:resource = "@xml/widget_test" />
- </ receiver >
3、修改ExampleAppWidgetProvider.java代码文件,如下:
- public class ExampleAppWidgetProvider extends AppWidgetProvider {
- //定义一个常量字符串,该常量用于命名Action
- private static final String UPDATE_ACTION = "learn.test.UPDATE_APP_WIDGET" ;
- @Override
- public void onDeleted(Context context, int [] appWidgetIds) {
- // TODO Auto-generated method stub
- 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) {
- // TODO Auto-generated method stub
- System.out.println("onReceive" );
- String action = intent.getAction();
- if (UPDATE_ACTION.equals(action)) {
- RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
- R.layout.widget01);
- remoteViews.setTextViewText(R.id.test_text, "this is OnReceive" );
- //getInstance(Context context) Get the AppWidgetManager instance to use for the supplied Context object.静态方法。
- AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
- ComponentName componentName = new ComponentName(context,ExampleAppWidgetProvider. class );
- appWidgetManager.updateAppWidget(componentName, remoteViews);
- } else {
- super .onReceive(context, intent); 这里一定要添加,eles部分,不然,onReceive不会去调用其它的方法。但是如果把这条语句放在外面,就会每次运行 onUpdate,onDeleted等方法,就会运行两次,因为UPDATE_ACTION.equals(action)配置成功会运行一 次,uper.onReceive(context, intent)配置成功又会运行一次,后都是系统自定义的。
- }
- }
- @Override
- public void onUpdate(Context context, AppWidgetManager appWidgetManager,
- int [] appWidgetIds) {
- // TODO Auto-generated method stub
- System.out.println("onUpdated" );
- //创建一个Intent对象
- Intent intent = new Intent();
- //为Intent对象设置Action
- intent.setAction(UPDATE_ACTION);
- //使用getBroadcast方法,得到一个PendingIntent对象,当该对象执行时,会发送一个广播
- PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0 ,
- intent, 0 );
- RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
- R.layout.widget01);
- remoteViews.setOnClickPendingIntent(R.id.widgetButton, pendingIntent);
- appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
- super .onUpdate(context, appWidgetManager, appWidgetIds);
- }
-
}
发表评论
-
Android JNI 编程常见小问题
2015-09-08 11:31 1229extern "C" { jint Jav ... -
Android ServiceManager注册自定义service
2015-08-19 09:53 4177当我们要使用android的系统服务时,一般都是使用Conte ... -
Android ALMP 架设web服务器配置
2014-10-08 18:48 1500随着信息时代的发展,智能手机已经越来越普及。下面本文将带大家把 ... -
Android UiAutomator 自动化测试
2014-07-04 17:39 10040一、一个BUG引发的问题 ... -
Android XP MTP支持
2014-03-18 16:41 2337家里电脑是win7,连上直接豌豆荚装驱动就好了。但单位的XP却 ... -
Android Launcher2 icon大小修改
2012-08-16 19:12 6071不同分辨率、不同屏幕的不同设备,android 原生的Laun ... -
android 浏览器APN切换
2012-04-16 16:42 2357业务需求:有些链接需 ... -
android 浏览器全屏显示
2012-04-16 16:40 4923业务需求:浏览器设置中支持全屏显示的功能。 分析:只需要在 ... -
Android MD5校验码的生成与算法实现
2012-03-05 15:05 20393在Java中,java.security.MessageDi ... -
Android View的xml属性
2012-02-27 13:25 2838java.lang.Object andro ... -
Android Gallery3D源码学习总结(三)——Cache缓存及数据处理流程
2011-12-29 11:04 4703第一,在应用程序中有三个线程存在:主线程(随activity的 ... -
Android Gallery3d源码学习总结(二)——绘制流程drawThumbnails
2011-12-29 11:02 2949此函数控制相册表格页 ... -
Android Gallery 3D 特效精华
2011-12-29 10:45 5340Android Gallery 3D 特效精华 一、布 ... -
Android Gallery3d源码学习总结(一)——绘制流程drawFocusItems
2011-12-29 10:42 2751显示单张图片相关的输入变量 int selecte ... -
Android软件汉化/精简/去广告教程
2011-08-23 12:32 2941前言: 现在随处都可以找到功能强大的汉化工具,操作简 ... -
Android ListView页眉页脚效果
2011-07-06 14:07 2687大家都知道,在我们调用ListView的addFooterVi ... -
Android 获取设备信息
2011-06-22 21:09 7978)android 获取设备型号、OS版本号: imp ... -
Android 应用安装设置
2011-05-31 16:18 1922应用程序的默认安装位置以及是否可移动取决于该程序的开发者的配置 ... -
Android Activity去除标题栏和状态栏
2011-05-31 13:10 40491一、在代码中设置 public void onCreate( ... -
Android最佳实践之响应灵敏性
2011-05-16 14:44 1371Android最佳实践之响应灵敏性 可能会存在这样 ...
相关推荐
布局文件可以包含文本、图片、按钮等组件,但需要注意的是,由于AppWidget运行在单独进程中,因此不能直接引用Activity中的资源,而应使用RemoteViews对象来操作这些组件。 例如,一个简单的AppWidget布局文件可能...
本篇文章将深入探讨如何使用`appWidget`来启动一个`Activity`。 首先,我们需要了解`appWidget`的基本构成。一个`appWidget`通常包含一个或多个`RemoteViews`,它们是显示在主屏幕上的视图组件。`RemoteViews`允许...
2. **将PendingIntent设置到RemoteViews**: 创建了PendingIntent后,我们需要将其关联到AppWidget中的某个视图,通常是Button或其他可点击的控件。例如: ```java RemoteViews views = new RemoteViews(context....
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="40dp" android:minHeight="40dp" android:updatePeriodMillis="1800000" <!-- 更新间隔,单位为毫秒 --> ...
总结,`android AppWidget ListView`的使用涉及到AppWidget框架、RemoteViews、ListView与Adapter的结合以及事件处理等多个核心概念。通过源码学习,可以深入理解这些组件的协同工作方式,提升Android开发技能。
在该类中,重写`onUpdate()`方法以在AppWidget被添加或更新时更新其UI。例如,我们可以在按钮点击时更新文本视图的内容: ```java public class AppWidgetProvider extends AppWidgetProvider { @Override ...
**AppWidget的简单使用** AppWidget是Android系统提供的一种组件,允许开发者在用户的主屏幕上创建小型、可交互的应用程序小部件。这些小部件无需用户直接启动应用,就能展示实时信息或者提供快速操作入口,极大地...
由于AppWidget运行在系统进程中,你需要通过`PendingIntent`和`BroadcastReceiver`来异步更新AppWidget的内容。例如,可以定期从服务器获取新数据,或者响应特定事件进行更新。 以上就是创建一个基本AppWidget的...
在"appwidget"这个压缩包文件中,可能包含了示例代码和资源文件,供开发者学习如何实现上述功能。通过研究这些文件,你可以更好地理解App Widget的工作原理和实现细节,从而在自己的项目中创建出富有特色的桌面小...
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> android:name="android.appwidget.provider" android:resource="@xml/widget_info" /> ``` `<meta-data>`标签里的`@xml/widget_info`...
App Widget 的概念 一个简单的App Widget例子 PendingIntent的使用 RemoteViews的使用 接收来自App Widget的广播 更新App Widget的控件状态
在Android平台上,AppWidget是应用程序可以提供的一种桌面小部件,让用户在主屏幕上获得快速的交互体验,无需打开完整的应用程序。这个“Android高级应用源码-Android小部件AppWidget.zip”包含了一个关于如何创建和...
- **RemoteViewsService**:当 AppWidget 需要展示更复杂的数据结构时(如 ListView 或 GridView),可以使用此服务提供数据。它继承自 Service 类,同样需要在 AndroidManifest.xml 文件中声明。 - **...
这个"Android应用源码之Android小部件AppWidget.zip"的源代码示例将帮助你理解并实践如何创建一个功能丰富的Android小部件,通过学习和分析源代码,你可以掌握AppWidget的原理和实现方法,进一步提升你的Android开发...
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="40dp" android:minHeight="40dp" android:updatePeriodMillis="0" android:initialLayout="@layout/widget...
本篇文章将深入探讨AppWidget下`getBroadcast`的使用以及其在Android系统中的工作原理。 首先,让我们理解什么是`getBroadcast`。在Android的`PendingIntent`类中,`getBroadcast`方法是用来创建一个PendingIntent...
在安卓平台上,AppWidget是Android系统提供的一种轻量级组件,允许开发者在用户的主屏幕上创建交互式的迷你应用程序,也就是我们通常所说的桌面小部件。这个压缩包"安卓Android源码——安卓Android小部件AppWidget....
在这个方法中,你可以调用AppWidgetManager的updateAppWidget()方法,传入AppWidget实例ID和新的远程视图(RemoteViews)对象,来改变小部件的显示内容。 - 另外,可以设定一个AlarmManager定时触发更新,或者监听...
在Android平台上,AppWidgetProvider是实现桌面小工具(AppWidget)功能的核心类。...通过这个简单的实例,我们可以了解到Android AppWidget的基本用法,为进一步开发更复杂、功能丰富的桌面小工具打下基础。
重写`onUpdate()`方法,在其中使用`AppWidgetManager`和`RemoteViews`更新AppWidget的界面。例如: ```java public class AppWidgetTest1 extends AppWidgetProvider { @Override public void onUpdate(Context ...