android 窗体小部件的制作
来源:互联网 发布:2016淘宝买家秀木耳 编辑:程序博客网 时间:2024/05/01 22:27
1.在layout中创建文件my_appwidget.xml布局文件,就是显示的小部件的窗口:
按照需求布局即可
2.在xml下创建文件my_appwidget_info.xml指定minWidth="40dp"minHeight="40dp"的属性:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="40dp" android:minHeight="40dp" android:updatePeriodMillis="86400000" android:initialLayout="@layout/my_appwidget" ></appwidget-provider>
3.由于小部件不依赖于Activity而存在,因此小部件内容的更新需要放置在服务中进行:
因此我们需要在MyAppWidgetProvider中重写AppWidgetProvider,用来接受与widget相关的删除,失效,生效和更新等消息,然后重写,并开启服务:
/** * 连接小部件 * @param context */ @Override public void onEnabled(Context context) { context.startService(new Intent(context,UpDateWidgeService.class)); super.onEnabled(context); } /** * 更新创建小部件 * @param context * @param appWidgetManager * @param appWidgetIds */ @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { context.startService(new Intent(context,UpDateWidgeService.class)); super.onUpdate(context, appWidgetManager, appWidgetIds); } /** * * @param context * @param appWidgetManager * @param appWidgetId * @param newOptions */ @Override public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { context.startService(new Intent(context,UpDateWidgeService.class)); super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); } /** * 删除小部件 * @param context * @param appWidgetIds */ @Override public void onDeleted(Context context, int[] appWidgetIds) { super.onDeleted(context, appWidgetIds); } /** * 删除到最后一个小部件时,销毁连接 * @param context */ @Override public void onDisabled(Context context) { context.stopService(new Intent(context,UpDateWidgeService.class)); super.onDisabled(context); }
4.开启服务后需要在服务中控制小部件的内容:
小部件内容需要实时更新,因此我们需要把更新的内容放置在定时器中:
小部件内容需要实时更新,因此我们需要把更新的内容放置在定时器中: @Override public void onCreate() { startTimer(); super.onCreate(); } //开启定时器,并更新UI private void startTimer() { mTimer = new Timer(); mTimer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { //更新UI的方法 appUpdateUI(); } },0,5000); } private void appUpdateUI() { //获取到 AppWidgetManager 的管理器 AppWidgetManager aMW=AppWidgetManager.getInstance(this); //远程控制View的方法,自己定义的小部件的样式。 RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.my_appwidget); //获取进程数的方法自定义,请不要完全抄写 int processCount = ProcessInfoProvider.getProcessCount(this); remoteViews.setTextViewText(R.id.process_count,"进程数"+processCount ); //获取剩余空间的方法,自定义,请不要完全抄写 remoteViews.setTextViewText(R.id.process_memory,"剩余空间"+ Formatter.formatFileSize(this,ProcessInfoProvider.getAvailSpace(this))); Intent intent=new Intent("android.intent.action.Home"); intent.addCategory("android.intent.category.DEFAULT"); PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT); remoteViews.setOnClickPendingIntent(R.id.rr_root,pendingIntent); PendingIntent myPendingIntent=PendingIntent.getBroadcast(this,0,new Intent("android.intent.action.KILL_BBRODE_PROCESS"),PendingIntent.FLAG_CANCEL_CURRENT); remoteViews.setOnClickPendingIntent(R.id.btn_clear,myPendingIntent); ComponentName componentName = new ComponentName(this,MyAppWidgetProvider.class); //更新小部件的内容 aMW.updateAppWidget(componentName,remoteViews); }
6.在清单文件中声明:<receiver android:name=".receiver.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>r
这样一个小部件的制作就完成了
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="40dp" android:minHeight="40dp" android:updatePeriodMillis="86400000" android:initialLayout="@layout/my_appwidget" ></appwidget-provider>
3.由于小部件不依赖于Activity而存在,因此小部件内容的更新需要放置在服务中进行:
/** * 连接小部件 * @param context */ @Override public void onEnabled(Context context) { context.startService(new Intent(context,UpDateWidgeService.class)); super.onEnabled(context); } /** * 更新创建小部件 * @param context * @param appWidgetManager * @param appWidgetIds */ @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { context.startService(new Intent(context,UpDateWidgeService.class)); super.onUpdate(context, appWidgetManager, appWidgetIds); } /** * * @param context * @param appWidgetManager * @param appWidgetId * @param newOptions */ @Override public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { context.startService(new Intent(context,UpDateWidgeService.class)); super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); } /** * 删除小部件 * @param context * @param appWidgetIds */ @Override public void onDeleted(Context context, int[] appWidgetIds) { super.onDeleted(context, appWidgetIds); } /** * 删除到最后一个小部件时,销毁连接 * @param context */ @Override public void onDisabled(Context context) { context.stopService(new Intent(context,UpDateWidgeService.class)); super.onDisabled(context); }
4.开启服务后需要在服务中控制小部件的内容:
小部件内容需要实时更新,因此我们需要把更新的内容放置在定时器中:
小部件内容需要实时更新,因此我们需要把更新的内容放置在定时器中: @Override public void onCreate() { startTimer(); super.onCreate(); } //开启定时器,并更新UI private void startTimer() { mTimer = new Timer(); mTimer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { //更新UI的方法 appUpdateUI(); } },0,5000); } private void appUpdateUI() { //获取到 AppWidgetManager 的管理器 AppWidgetManager aMW=AppWidgetManager.getInstance(this); //远程控制View的方法,自己定义的小部件的样式。 RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.my_appwidget); //获取进程数的方法自定义,请不要完全抄写 int processCount = ProcessInfoProvider.getProcessCount(this); remoteViews.setTextViewText(R.id.process_count,"进程数"+processCount ); //获取剩余空间的方法,自定义,请不要完全抄写 remoteViews.setTextViewText(R.id.process_memory,"剩余空间"+ Formatter.formatFileSize(this,ProcessInfoProvider.getAvailSpace(this))); Intent intent=new Intent("android.intent.action.Home"); intent.addCategory("android.intent.category.DEFAULT"); PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT); remoteViews.setOnClickPendingIntent(R.id.rr_root,pendingIntent); PendingIntent myPendingIntent=PendingIntent.getBroadcast(this,0,new Intent("android.intent.action.KILL_BBRODE_PROCESS"),PendingIntent.FLAG_CANCEL_CURRENT); remoteViews.setOnClickPendingIntent(R.id.btn_clear,myPendingIntent); ComponentName componentName = new ComponentName(this,MyAppWidgetProvider.class); //更新小部件的内容 aMW.updateAppWidget(componentName,remoteViews); }
6.在清单文件中声明:
<receiver android:name=".receiver.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>r
这样一个小部件的制作就完成了
0 0
- android 窗体小部件的制作
- android窗体小部件
- Android AppWidget(窗体小部件)详解
- android学习笔记---61_Widgets,窗口小部件的制作...
- 自己制作调节阴影的CSS3小部件!
- android 窗口小部件 的实现
- Android 桌面小部件(AppWidgetProvider)的应用
- Android小部件介绍
- Android天气小部件
- android 窗口小部件
- Android小部件AppWidget
- android 桌面小部件
- Yii2.0-Widget小部件制作
- Android 窗口小部件例子
- android--电量监控小部件
- android 桌面小部件实例
- 【Android】AppWidget桌面小部件
- android 应用程序窗口小部件
- Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句
- 为什么类的定义中不能包含自身类型,而可以包含其自身的指针类型和引用类型
- Altium Designer要点笔记
- UIPageViewController 设置滑动事件监听
- [UOJ#207]共价大爷游长沙
- android 窗体小部件的制作
- ajax的数据传输格式
- iOS编译时类型与运行时类型
- WEBSERVICE 自动生成服务端和客户端 axis
- 正则表达式:Pattern类与Matcher类详解
- Ubuntu安装ida pro
- Linux下SVN部署/安全及权限配置,实现web同步更新
- ubuntu修改默认启动级别
- android开发内存优化之如何有效避免oom