- 浏览: 270912 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
tonytony3:
THANK YOU
Android多级树形菜单的实现 -
haiyang08101:
deleteNumber = "421f481e-7 ...
java对xml文件做增删改查 -
求求你帮帮我:
怎么把我的空格也当成节点处理了?
java对xml文件做增删改查 -
求求你帮帮我:
deleteNumber = "421f481e-7 ...
java对xml文件做增删改查 -
lpj13579:
多谢分享,学习学习
高仿小米盒子UI效果实现
什么是AppWidget?AppWidget就是我们平常在桌面上见到的那种一个个的小窗口,利用这个小窗口可以给用户提供一些方便快捷的操作。本篇打算从以下几个点来介绍AppWidget:
1.如何创建一个简单的AppWidget
2.如何使得AppWidget与客户端程序交互
创建简单的AppWidget
在介绍之前给大家看一下程序运行的最后结果和项目结构图,以便大家有个整体的印象。
运行结果图:
项目结构图:
第一步:
首先在res文件夹下新建一个名字为xml的文件夹,然后在xml目录下创建一个名为appwidget01的xml文件(如上图所示)。这个appwidget01中的内容如下:
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth = "294dp" android:minHeight = "72dp" android:updatePeriodMillis = "86400000" android:initialLayout = "@layout/appwidgetlayout" > </appwidget-provider>
这个xml是用来描述你所要创建的appWidget的一些描述信息的,比如高度、宽度、刷新间隔、布局文件等等。仅仅这个描述文件还不够,我们看到的appWidget可都是有界面元素的呀,比如说文本,图片,按钮等等,这些东西的定义都需要放到layout文件夹下面。这个文件就是上面代码中写到的那个appwidgetlayout。
第二步:
在layout文件夹下面新建一个appwidgetlayout.xml文件,在这个文件中描述了appWidget的控件和布局等等信息,就和我们平常创建的一个activity的布局文件没什么两样,因为只是简单的演示,所以仅用一个文本和一个按钮。xml的内容如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/txtapp" android:text="test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#ffffff"></TextView> <Button android:id="@+id/btnSend" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send"></Button> </LinearLayout>
第三步:
既然appWidget中存在按钮等等控件,那么就肯定少不了处理这些控件事件的处理代码啦。这些代码被放在一个继承于AppWidgetProvider的类中,在本例子中我新建了一个AppWidget的类,该类继承于AppWidgetProvider,以后所有的AppWidget上面的控件事件都会在这个类中处理。看一下类的内容:
public class AppWidget extends AppWidgetProvider { private final String broadCastString = "com.qlf.appWidgetUpdate"; /** * 删除一个AppWidget时调用 * */ @Override public void onDeleted(Context context, int[] appWidgetIds) { super.onDeleted(context, appWidgetIds); } /** * 最后一个appWidget被删除时调用 * */ @Override public void onDisabled(Context context) { super.onDisabled(context); } /** * AppWidget的实例第一次被创建时调用 * */ @Override public void onEnabled(Context context) { super.onEnabled(context); } /** * 接受广播事件 * */ @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); } /** * 到达指定的更新时间或者当用户向桌面添加AppWidget时被调用 * */ @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { } }
各个方法的作用大家一看上面的注释就明白了。我们暂时不需要实现里面的方法。
第四步:
在AndroidManifest.xml中定义一些创建AppWidget必要的东西,先看代码:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.qlf.widget" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name="AppWidget"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget01" /> </receiver> </application> <uses-sdk android:minSdkVersion="8" /> </manifest>
可以看到我们在配置文件里面定义了一个receiver,他的名字是上面创建处理控件代码的那个类,下面那个intent-filter中的action是系统自带的用于更新所有appwidget的广播动作。然后meta-data标签是一个描述我们创建appwidget的元数据,那个android:name="android.appwidget.provider"是固定的,android:resource="@xml/appwidget01"指定创建的appWidget的描述信息的位置。这样程序就知道到哪里去初始化这些appWidget啦。
经过上面四个步骤,我想您已经能够成功在桌面上添加小工具了,效果就是我们最前面发出的样子。
AppWidget与程序交互
前面我们只是简单的介绍了如何创建一个appWidget,但是目前这个appWidget还没有任何的交互功能。下面我们介绍一下appWidget如何与程序进行交互。首先要介绍一个对象,这个对象在appwidget和程序的交互中很重要,他就是RemoteViews。因为appwidget运行的进程和我们创建的应用不在一个进程中,所以我们也就不能像平常引用控件那样来获得控件的实例。这个时候RemoteViews出场了,从字面上看他的意思是远程的视图,也就是说通过这个东西我们能够获得不在同一进程中的对象,这也就为我们编写appwidget的处理事件提供了帮助。我们使用一下代码来创建一个RemoteViews :
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.appwidgetlayout); remoteViews.setOnClickPendingIntent(R.id.btnSend, pendingIntent); //为小工具上的按钮绑定事件
可以看到上面又出现了一个陌生的对象pendingIntent,这个又是用来干嘛的呢?我们知道在一般的程序中绑定按钮的点击事件是直接在实现了OnClickListener接口的类中中完成的。不过因为appwidget并不在我们应用的进程中,所以当然他也访问不到我们在应用中设置的onclick代码啦。而PendingIntent就是被用来解决这个问题的。PendingIntent可以看成是一个特殊的Intent,如果我们把Intent看成一封信,那么PendingIntent就是一封被信封包裹起来的信。这封信在remoteViews.setOnClickPendingIntent()中被“邮寄”到了appwidget, 当appwidget中的按钮单击时他知道将这封信打开,并执行里面的内容。这样就避免了直接从appwidget中执行本地代码。我们来看看PendingIntent是如何定义的:
//创建一个Intent对象 Intent intent = new Intent(); intent.setAction(broadCastString); //这一步相当于写信,说明这个信的作用到底是什么,在这里表示将发送一个广播 PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
有了上面的介绍,我们在创建appwidget的交互应用时就简单不少了。我们剩下要做的工作就是在appwidget在创建的时候调用上面说到的方法为appwidget中的控件绑定事件,也就是在AppWidget类下的onUpdate方法中完成这个过程。
/** * 到达指定的更新时间或者当用户向桌面添加AppWidget时被调用 * */ @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { //创建一个Intent对象 Intent intent = new Intent(); intent.setAction(broadCastString); //设置pendingIntent的作用 PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.appwidgetlayout); //绑定事件 remoteViews.setOnClickPendingIntent(R.id.btnSend, pendingIntent); //更新Appwidget appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); }
通过上面的代码我们就为button按钮绑定了一个事件,这个事件的作用是发送一个广播便于其他应用接收、更新信息。这是appwidget发送广播,那么appwidget如何接受来自其他程序发送的广播呢?这就是public void onReceive(Context context, Intent intent)的功能啦。这个方法会接收来自其他应用发出的广播,我们只要在这个程序中过滤我们需要的广播就能响应其他应用的操作来更新appwidget的信息了。要注意的是,因为appwidget运行的进程和我们创建的应用不在一个进程中的限制,所以更新的appwidget的时候也要通过远程对象来操作,具体代码如下:
/** * 接受广播事件 * */ @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(broadCastString)) { //只能通过远程对象来设置appwidget中的控件状态 RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.appwidgetlayout); //通过远程对象将按钮的文字设置为”hihi” remoteViews.setTextViewText(R.id.btnSend, "hihi"); //获得appwidget管理实例,用于管理appwidget以便进行更新操作 AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); //相当于获得所有本程序创建的appwidget ComponentName componentName = new ComponentName(context,AppWidget.class); //更新appwidget appWidgetManager.updateAppWidget(componentName, remoteViews); } super.onReceive(context, intent); }
总结下就是appwidget上的操作都必须借助远程对象来操作。最后看一下运行的图片吧:
按之前:
按之后:
代码下载:
请查看附件.
发表评论
-
Android 三大图片加载框架比较
2016-11-30 10:31 10781.哪三大图片加载框架? 1) Pi ... -
仿微信小视屏拍摄的进度条/自定义的progressBar的样式。
2016-08-20 00:25 1020今天有个需求,就是需要倒计时的进度条,样式参考微信小视屏拍摄 ... -
android 闹钟定时任务 AlarmManager
2016-06-02 13:41 1821直接上代码 package com.exampl ... -
android应用实现重启系统
2016-06-02 13:33 35121.在AndroidManifest.xml文件的manif ... -
android 每天定时提醒功能实现
2016-06-01 22:42 0android要实现定时的功 ... -
Java Calendar 类的时间操作
2016-06-01 21:02 661ava Calendar 类时间操作,这也许是创建日历和管理 ... -
android中fragment和activity之间相互通信
2014-11-13 16:25 1433在用到fragment的时候,老是会遇到一个问题,就是fra ... -
墨迹天气上下滑动viewpager
2014-11-04 17:15 742墨迹天气上下滑动viewpager -
Android杂谈--打开文件的Intent及使用
2014-10-25 13:03 639在写文件管理系统时会用到各种打开不同格式的文件的需求,由于A ... -
获取Android签名证书的sha1值
2014-08-23 23:14 657前言:今天开始研 ... -
java中Keytool的使用总结
2014-08-23 22:40 557J2SDK提供了keytool命令行工具,可以根据指定的参数 ... -
android获取versionName和versionCode
2014-07-08 18:02 733<TextView android:textSize= ... -
Android如何防止apk程序被反编译
2014-07-08 17:22 703作为Android应用开发者,不得不面对一个尴尬的局面,就是 ... -
在GridView中实现单选或多选功能
2014-06-26 13:08 816由于项目需要,要用到GridView实现多选功能,在网上搜 ... -
Android中Tween动画和Frame动画实例
2014-06-26 10:46 721Animation主要有两种动画模式:Tween动画和Fra ... -
android 禁用和开启四大组件的方法(setComponentEnabledSetting )
2014-06-19 15:26 0为什么要关闭组件? 在用到组件时,有时候我们可能暂时性的不使 ... -
android MD5校验码的生成与算法实现
2014-06-17 10:58 880在Java中,java.security.Mes ... -
android 自动检测版本升级
2014-06-15 14:10 382这里我用别的app代替了,简单省事,正常的话,你要对你的 ... -
layout左右平滑控制.
2014-04-30 09:41 608<?xml version="1.0&quo ... -
android让你的TabHost滑动起来
2014-04-22 22:13 815在Android应用中,一般TabActivity和若干个T ...
相关推荐
概述 官方参考 Build an App Widget 效果图 放张效果图,这是我玩的桌面 app 文件夹 ... android:name=android.appwidget.provider android:resource=@xml/widget_desktop_options /> <intent-fi
### C语言界面编程小结 #### 一、引言 在计算机编程领域,用户界面(User Interface, UI)设计是连接用户与程序之间的桥梁。对于使用C语言进行开发的程序员而言,掌握界面编程技术是非常重要的。本文将从C语言界面...
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.
#### 四、小结 通过本次实验,我们不仅了解了如何设计和实现登录与注册页面,还学习了如何通过Intent实现Activity之间的跳转,以及如何使用SharedPreferences存储用户信息。这对于Android应用的开发来说是非常基础...
### 四、小结 通过以上分析,我们了解到`NotificationUtils`工具类主要用于处理与Android通知相关的操作,包括普通文本通知和进度条通知的发送。这些方法不仅方便了开发者快速构建通知,同时也为用户提供了更丰富的...
#### 五、小结 通过对这份简单的Android计算器源码的分析,我们可以了解到其实现的基本流程和关键点。虽然这是一个非常基础的应用,但它包含了构建更复杂应用所需的基础组件和技术。对于初学者来说,这是一个很好的...
#### 四、小结 通过上述步骤,我们已经在Android应用中成功集成了B站的弹幕系统,并实现了基本的弹幕功能。此外,还可以进一步定制弹幕的样式和行为,如添加动画效果、支持图片弹幕等。希望本文能够帮助您更好地理解...
Razorpay Checkout Widget是Razorpay提供的一个交互式支付界面,用户可以在不离开你的应用的情况下完成支付。`react-razorpay-button`会触发这个小部件,展示一个包含所有必需支付信息的弹出窗口。 ### 四、集成与...
#### 四、小结 通过上述步骤,我们已经成功实现了基于`Button`的事件处理机制。用户可以点击按钮触发相应的操作,例如跳转到新的页面、改变文本视图的内容或者显示一条提示消息等。这种方法是Android应用开发中最...
Android 使用 Vitamio 插件...小结 使用 Vitamio 插件可以实现简易的视频播放器, Vitamio 库提供了多种媒体格式的支持,并且支持多种平台。使用 Vitamio 插件可以快速实现视频播放器,并且可以根据需要进行定制化。
六、 小结 Android 多线程网络聊天室通信是使用多线程技术在 Android 平台上实现网络聊天室通信的一种方法。这种技术可以提高程序的响应速度和用户体验。通过使用 TCP/IP 通信协议和 Java 的网络通信支持,可以实现...
Android 实现带有进度条...小结 本文通过一个实例详细介绍了 Android 实现带有进度条的按钮效果的方法,包括布局文件和 Java 代码的实现。这种效果常用于下载、上传、安装等过程中显示进度的变化,可以提高用户体验。
六、 小结 本文详细介绍了Android自定义密码样式的制作方法,并提供了相应的代码实现。通过自定义密码样式,我们可以将密码输入框中的黑点符号替换为特殊字符,以提高密码的安全性。同时,我们也可以根据需要自定义...