安卓之appwidget学习总结
2013-08-01 19:28
267 查看
appwidget就是我们常用的桌面控件,最常见的就是桌面上的时钟控件。
appwidget实质上是一个带界面的广播。我是这么认为的。。
首先先构造一个appwidget:
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,intentClick, 0);
这里有三个选择有getBroadcast,getActivity还有getService.
但是我在实际使用中发现了这个问题:即以broadcast形式发送点击事件会在一些清理软件杀进程之后失效,点击就没效果了。
但是通过按钮启动一个activity的话就不会产生这个问题,如果是一些比较短时间的操作,我想用这个,然后把theme设置为透明主题的话和后台效果就一样了,而且一会有失效的结果 ,更何况现在手机root的比例较大,而且清理已经成了用户的习惯。
桌面控件的描述文件放在res文件夹里的xml文件夹:
包括大小,关于大小应为(你想要的格子x74)-2,一个格子是74x74的.
updatePeriodMillis是更新的周期,sdk在1.5以后就不支持这个了,可能是为了省电吧,要自己写一个service来更新,我想这可能也是为什么被杀了进程之后,serivce应该就没了,所以桌面上的小控件就不会继续更新了。
关于这个configure,如果你的桌面控件生效之前需要启动一个activity来初始化的话就需要配置一个configure。
widget的布局文件依旧放在layout文件夹里:
这是我写的一个桌面上的开关控件。
前面说到appwidget类似于一个广播 ,所以也要注册在xml里的:
这样下来一整个桌面控件就做完了。
appwidget实质上是一个带界面的广播。我是这么认为的。。
首先先构造一个appwidget:
public class FirstWidget extends AppWidgetProvider { @Override public void onDeleted(Context context, int[] appWidgetIds) { // TODO Auto-generated method stub super.onDeleted(context, appWidgetIds); } @Override public void onDisabled(Context context) { // TODO Auto-generated method stub super.onDisabled(context); } @Override public void onEnabled(Context context) { // TODO Auto-generated method stub super.onEnabled(context); // context.startService(new Intent(context, FSerVice.class)); } @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub super.onReceive(context, intent); AppWidgetManager appWidgetManger = AppWidgetManager .getInstance(context); int[] appIds = appWidgetManger.getAppWidgetIds(new ComponentName( context, FirstWidget.class)); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); views.setImageViewResource(R.id.imageView,R.drawable.ic_launcheron); } appWidgetManger.updateAppWidget(appIds, views); } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // TODO Auto-generated method stub Bitmap bmp; if (mContext == null) { mContext = context; } super.onUpdate(context, appWidgetManager, appWidgetIds); RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.widget); Intent intentClick = new Intent(SET_WIFI_ACTION); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intentClick, 0); views.setOnClickPendingIntent(R.id.imageView, pendingIntent) appWidgetManager.updateAppWidget(appWidgetIds, views); /** 为AppWidget设置点击事件的响应 */ } }
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,intentClick, 0);
这里有三个选择有getBroadcast,getActivity还有getService.
但是我在实际使用中发现了这个问题:即以broadcast形式发送点击事件会在一些清理软件杀进程之后失效,点击就没效果了。
但是通过按钮启动一个activity的话就不会产生这个问题,如果是一些比较短时间的操作,我想用这个,然后把theme设置为透明主题的话和后台效果就一样了,而且一会有失效的结果 ,更何况现在手机root的比例较大,而且清理已经成了用户的习惯。
桌面控件的描述文件放在res文件夹里的xml文件夹:
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/widget" android:minWidth="72dp" android:minHeight="72dp" android:updatePeriodMillis="0" android:configure="com.example.widgetflashlight.FileActivity" > </appwidget-provider>
包括大小,关于大小应为(你想要的格子x74)-2,一个格子是74x74的.
updatePeriodMillis是更新的周期,sdk在1.5以后就不支持这个了,可能是为了省电吧,要自己写一个service来更新,我想这可能也是为什么被杀了进程之后,serivce应该就没了,所以桌面上的小控件就不会继续更新了。
关于这个configure,如果你的桌面控件生效之前需要启动一个activity来初始化的话就需要配置一个configure。
widget的布局文件依旧放在layout文件夹里:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageButton android:id="@+id/imageView" android:layout_width="72dp" android:layout_height="36dp" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:src="@drawable/ic_launcheron" /> </RelativeLayout>
这是我写的一个桌面上的开关控件。
前面说到appwidget类似于一个广播 ,所以也要注册在xml里的:
<receiver android:name="FirstWidget" > <intent-filter > <action android:name="android.appwidget.action.APPWIDGET_UPDATE" > </action> <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> <action android:name="com.example.widgetflashlight.action.widget.click" > </action> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget" /> </receiver>过滤器里面的几个action是这个桌面控件需要“听”见的,这里有它的点击事件,wifi开关状态的改变,还有它自己的更新广播 。
这样下来一整个桌面控件就做完了。
相关文章推荐
- 近期的安卓学习开发SOS APP的一些总结文档 (拨打电话 加载首页图片的异步代码 判断是否有网络代码)
- AppWidget 学习总结
- 近期的安卓学习开发SOS APP的一些总结文档 (拨打电话 加载首页图片的异步代码 判断是否有网络代码)
- 安卓ApiDemos学习 app/Activity/Forwarding
- 安卓ApiDemos学习 app/Activity/ReceiveResult
- 安卓学习资料总结-39
- 【原创】Android学习appwidget制作一个桌面相册幻灯片
- FirstApp,iphone开发学习总结1,UIview添加UIimage
- Android中AppWidget的学习整理(附demo)
- 我的安卓学习的总结(持续补充,供自己参考)
- android(安卓)开源框架学习总结
- 安卓ApiDemos学习 app/Activity/Wallpaper
- PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [6] 版本升级接口开发
- 安卓图像更新学习总结
- FirstApp,iphone开发学习总结10,归档(序列化、固化)
- Android之Widget学习总结
- 安卓开发由一个APP拉起另一个APP的方法总结
- Android学习指南之三十五:App Widget开发入门指导
- android app widget,安卓桌面小工具的使用