这两天要求做一个桌面小控件(wedgit),控件上的内容是可变的(根据业务加载不同的图片),所以要求能及时更新,由于sdk1.5以后取消了
android:updatePeriodMillis="1000"的自动更新,所以我就用了service结合定时器来实现,但是service是一直运行在后台,所以比较消耗资源;如有朋友知道较好的解决方法,请不吝赐教!谢!
我的实现如下:
在res文件夹下新建xml文件夹,里面加入wedgit.xml:
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="180dp"
android:minHeight="150dp"
android:updatePeriodMillis="1000"
android:initialLayout="@layout/widget_first">
</appwidget-provider>
widget_first.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="wrap_content"
android:layout_gravity="center"
android:background="@drawable/alert_line">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical"
android:background="@drawable/bg">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="40dp"
android:gravity="center"
android:background="@drawable/im_tab_bg">
<TextView
android:id="@+id/tv_widget_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true">
</TextView>
</LinearLayout>
<!-- <View
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="#99CCFF">
</View> -->
<LinearLayout
android:id="@+id/ll_widget_middle_login"
android:layout_width="fill_parent"
android:layout_height="60dp"
android:gravity="center"
android:background="@drawable/im_tab_bg">
<Button
android:id="@+id/bt_widget_login"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:focusable="true"
android:background="@drawable/btn_poiitem_selector"
android:text="登陆">
</Button>
</LinearLayout>
<LinearLayout
android:id="@+id/ll_widget_middle_person"
android:layout_width="fill_parent"
android:layout_height="60dp"
android:orientation="horizontal"
android:background="@drawable/im_tab_bg">
<ImageView
android:id="@+id/iv_widget_header"
android:layout_marginTop="2dp"
android:layout_marginLeft="10dp"
android:layout_width="50dp"
android:layout_height="50dp">
</ImageView>
<TextView
android:id="@+id/tv_widget_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp">
</TextView>
</LinearLayout>
<!-- <View
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="#0099FF">
</View> -->
<LinearLayout
android:id="@+id/ll_widget_weather"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_widget_weather_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:src="@drawable/logo">
</ImageView>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="80dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_widget_temperature"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
<TextView
android:id="@+id/tv_widget_weather_content"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</TextView>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
配置文件:
<service android:name=".app.widget.PETWidget$WidgetService"/>
<receiver android:name=".app.widget.PETWidget">
<intent-filter>
<action android:name="com.terry.action.widget.click"/>
<action android:name="com.terry.action.widget.setting"/>
<action android:name="com.terry.action.widget.weather"/>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/wedgit"/>
</receiver>
由于AppWidgetProvider是继承了广播接收器组件,所以要配成<receiver>
package com.lolaage.app.widget;
import java.util.Timer;
import java.util.TimerTask;
import com.lolaage.R;
import com.lolaage.app.activity.LoginActivity;
import com.lolaage.app.activity.SystemInitActivity;
import com.lolaage.app.activity.widget.WidgetFirstActivity;
import com.lolaage.app.activity.widget.WidgetSettingActivity;
import com.lolaage.deamon.HandlerManager;
import com.lolaage.deamon.Memory;
import com.lolaage.tool.Constant;
import com.lolaage.tool.PoiUtil;
import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.view.View;
import android.widget.RemoteViews;
public class PETWidget extends AppWidgetProvider {
//widget单击动作
private static final String ACTION_CLICK = "com.terry.action.widget.click";
private static final String ACTION_SETTING = "com.terry.action.widget.setting";
private static final String ACTION_WEATHER = "com.terry.action.widget.weather";
private static RemoteViews rv;
private static ComponentName com;
private static AppWidgetManager app;
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
// Log.v("=====PETWidget=====", "onReceive");
Intent i ;
if(intent.getAction().equals(ACTION_CLICK)){
i = new Intent(context,LoginActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}else if(intent.getAction().equals(ACTION_SETTING)){
i = new Intent(context,WidgetSettingActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}else if(intent.getAction().equals(ACTION_WEATHER)){
i = new Intent(context,SystemInitActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Message msg = new Message();
msg.obj = Constant.ACTIVITY_ID_WEATHER;
msg.what = Constant.ACTIVITY_ID_WEATHER;
Handler handler = HandlerManager.getHandler(SystemInitActivity.class.getName());
handler.sendMessage(msg);
context.startActivity(i);
}
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
context.startService(new Intent(context,WidgetService.class));
}
public static class WidgetService extends Service{
private Timer timer = new Timer();
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
updateWidget();
break;
default:
break;
}
};
};
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
}
},0,1000);
}
/**
* 更新
*/
private void updateWidget(){
rv = new RemoteViews(getPackageName(), R.layout.widget_first);
Intent intent;
PendingIntent pending;
if(Memory.isLogin){
rv.setViewVisibility(R.id.ll_widget_middle_login, View.GONE);
rv.setViewVisibility(R.id.ll_widget_middle_person, View.VISIBLE);
//初始化头像
if(!"".equals(PoiUtil.HEADERPATH)){
rv.setImageViewBitmap(R.id.iv_widget_header, PoiUtil.imageChange(PoiUtil.HEADERPATH));
}else{
rv.setImageViewResource(R.id.iv_widget_header,R.drawable.no_header2);
}
rv.setTextViewText(R.id.tv_widget_name,"姓名:\n"+Memory.mSelf.getNickName());
intent = new Intent(ACTION_SETTING);
pending = PendingIntent.getBroadcast(this, 0, intent, 0);
rv.setOnClickPendingIntent(R.id.ll_widget_middle_person, pending);
}else{
rv.setViewVisibility(R.id.ll_widget_middle_person, View.GONE);
rv.setViewVisibility(R.id.ll_widget_middle_login, View.VISIBLE);
intent = new Intent(ACTION_CLICK);
pending = PendingIntent.getBroadcast(this, 0, intent, 0);
rv.setOnClickPendingIntent(R.id.bt_widget_login, pending);
}
Intent intentWeather = new Intent(ACTION_WEATHER);
PendingIntent pendingW = PendingIntent.getBroadcast(this, 0, intentWeather, 0);
rv.setOnClickPendingIntent(R.id.ll_widget_weather, pendingW);
rv.setTextViewText(R.id.tv_widget_title, PoiUtil.WIDGET);
//获取组件的完整名字
com = new ComponentName(this, PETWidget.class);
//执行内容更新
app = AppWidgetManager.getInstance(this);
app.updateAppWidget(com, rv);
}
@Override
public void onDestroy() {
if(timer != null){
timer.cancel();
}
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}}
}

- 大小: 37 KB
分享到:
相关推荐
在Android开发中,为了追求应用界面的个性化和用户体验的提升,开发者经常需要对原生控件进行自定义,...在压缩包文件"android_0803_wedgit"中,可能包含了实现上述功能的相关代码和资源文件,可以参考学习以加深理解。
Wordpress 插件让主题以自己的方式自定义仪表板 特征 更改仪表盘标题 更改仪表盘标题 更改欢迎面板内容或禁用它 更改版本 更改版权 删除选定的仪表板元框(仅限默认) 删除管理栏菜单 删除菜单页 ...
内容概要:本文详细介绍了一个使用MATLAB实现多元线性回归预测的实战案例。主要内容包括:如何读取Excel数据并进行预处理,如去除缺失值、添加常数项、标准化等;利用MATLAB内置的regress函数进行模型训练,获取回归系数;通过矩阵运算完成预测,并提供多种可视化方法展示预测效果,如散点图、残差图等;同时介绍了常见的错误及其解决方法,以及如何调整数据集以适应不同应用场景。文中还强调了R方值的意义及其局限性。 适合人群:适用于具有一定数学基础和初步编程经验的学习者,尤其是希望快速掌握MATLAB进行数据分析和机器学习的人群。 使用场景及目标:①帮助初学者理解多元线性回归的基本概念和实现步骤;②提供完整的代码模板,便于使用者根据自身需求修改和扩展;③通过具体实例演示,使读者能够独立完成从数据准备到模型评估的全过程。 其他说明:本文不仅提供了详细的代码注释和技术要点解析,还给出了许多实用的小技巧,如避免常见错误的方法、提高模型性能的建议等。此外,作者鼓励读者尝试不同的数据集和参数设置,以加深对多元线性回归的理解。
项目资源包含:可运行源码+sql文件+; python3.8+Django3.2.8+mysql5.7+html+scikit-learn+pyecharts+pandas 适用人群:学习不同技术领域的小白或进阶学习者;可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 运行步骤 需要先安装Python的相关依赖:pymysql,Django==3.2.8, 使用pip install 安装 第一步:创建数据库,数据库名:movie_analysis 第二步:执行SQL语句,movie_analysis.sql文件,运行该文件中的SQL语句 第三步:源码文件为movie_analysis.zip,修改源代码中的settings.py文件,改成自己的mysql数据库用户名和密码 第四步:运行命令:python manage.py runserver 8000 第五步:打开浏览器查看http://127.0.0.1:8000 测试账户: 用户名:admin 密码:123
内容概要:本文详细介绍了基于西门子S7-1200 PLC和HMI触摸屏的3x3智能立体车库仿真控制系统的设计与实现。系统采用矩阵定位算法进行车位管理,通过PLC程序控制载车板的精确移动,并利用PWM指令调节电机转速。HMI界面上通过颜色区分车位状态,并实现了与PLC的数据绑定。文中还讨论了路径仲裁、异常处理、电机控制以及仿真调试等多个关键技术点,强调了联调过程中遇到的实际问题及其解决方案。 适合人群:自动化控制领域的工程师和技术人员,尤其是对PLC编程和HMI设计有一定基础的人群。 使用场景及目标:适用于学习和研究智能立体车库的控制系统设计,帮助理解和掌握PLC编程、HMI界面设计、电机控制及异常处理等方面的知识。目标是提高对复杂工业控制系统的理解和应用能力。 其他说明:文章提供了丰富的代码示例和调试经验,有助于读者更好地理解和实践。同时,文中提到的一些具体问题和解决方案对于实际工程项目也有很好的借鉴意义。
内容概要:本文详细介绍了基于C#和WPF开发的MES(制造执行系统)上位机源码产线执行系统。该系统涵盖了多个关键技术的应用,包括WPF界面开发、AGV自动调度、SQL SERVER数据库操作、TCP/IP SOCKET数据传输、EXCEL数据查询与导出以及库位管理和多线程技术。文中不仅展示了各个模块的具体实现代码,还分享了许多实战经验和优化技巧,如A*路径规划算法、EF Core混合原生SQL、异步Socket实现心跳机制、多线程处理传感器数据等。 适合人群:具备一定编程基础,尤其是熟悉C#和WPF的开发者,以及从事工业自动化领域的工程师和技术人员。 使用场景及目标:适用于制造业企业,旨在提高生产线的自动化程度和管理效率。具体应用场景包括但不限于:产线设备监控、物料运输调度、生产数据分析与报告生成等。目标是构建一个稳定高效的MES系统,满足工业生产的需求。 其他说明:文章强调了在实际项目中遇到的各种挑战及其解决方案,如数据库锁竞争、UI线程阻塞等问题,并提供了一些实用的编码技巧和最佳实践。此外,还涉及了一些高级特性,如动态脚本引擎、三维货架渲染等,增加了系统的灵活性和用户体验。
内容概要:本文档展示了如何在PyTorch中实现自注意力机制(Self-Attention)并将其应用于Vision Transformer(ViT)模型。首先定义了一个`SelfAttention`类,该类实现了多头自注意力机制,包括查询、键、值的线性变换、多头分割、注意力分数计算以及加权求和等步骤。接着定义了`get_model`函数,用于获取一个修改后的ViT模型:加载预训练的ViT-B/16模型,在其Transformer编码器层中用自定义的`SelfAttention`替换原有的注意力模块,并调整分类头以适应新的类别数量。最后,在主程序中创建模型实例并测试其输入输出形状。; 适合人群:熟悉PyTorch框架,对深度学习尤其是Transformer架构有一定了解的研究人员或工程师。; 使用场景及目标:①理解自注意力机制的具体实现细节;②掌握如何在现有预训练模型上进行定制化修改以满足特定任务需求;③学习如何将自定义模块集成到复杂的神经网络结构中。; 阅读建议:由于代码涉及较多PyTorch API的使用,建议读者提前熟悉相关API文档;同时,为了更好地理解代码逻辑,可以结合Transformer的工作原理一同学习。
程序设计语言基础JAVAWEB_网上购物系统(论文范文_JSP_JAVA_毕业设计)[2025网盘版.备考复习]
内容概要:本文详细介绍数据库课程设计的全流程,涵盖从入门到精通的各个方面。首先阐述了数据库课程设计的重要性,指出其作为连接理论与实践的桥梁,对计算机相关专业学生至关重要。接下来介绍了前期准备,包括理论知识储备(如数据库概念、数据模型、SQL语言)和工具环境搭建(如选择合适的DBMS)。随后深入探讨需求分析,强调与相关人员沟通的重要性,并从数据需求和事务需求两方面入手明确系统功能和数据存储。接着讲解概念结构设计,通过构建E-R模型将用户需求转化为具体概念模型,展示实体、属性和关系。再介绍逻辑结构设计,将E-R图转换为关系模式,并进行模式优化以消除冗余和异常。物理结构设计部分探讨了存储结构与存取方法的选择,以及数据字典和索引设计的重要性。最后,文章描述了数据库实施阶段,包括创建数据库对象、编写数据操作代码和调试技巧。总结部分回顾了整个设计过程,强调了理论与实践相结合的意义,鼓励学生继续探索数据库技术。 适合人群:计算机相关专业的本科生或研究生,特别是正在或即将参与数据库课程设计的学生。 使用场景及目标:①帮助学生理解数据库课程设计的各个阶段和任务;②指导学生完成从需求分析到数据库实施的全过程;③培养学生的逻辑思维能力和解决实际问题的能力。 其他说明:本文不仅提供了详细的理论知识和技术指导,还强调了团队合作和持续学习的重要性,鼓励学生在未来的学习和工作中积极参与实际项目,不断提升自己在数据库领域的专业能力。
经典珍藏版本 Delphi 4.0安装盘
中职语文《哦,香雪》教学设计.docx
内容概要:本文详细介绍了针对电动汽车低速车60V平台的MOS电机控制器方案,涵盖FOC(磁场定向控制)算法的软硬件实现。软件部分展示了FOC算法的核心代码,如电流环实现、Clarke变换、Park变换、SVPWM生成等,强调了算法优化和实时性能。硬件部分则深入解析了主控芯片、MOSFET驱动电路、电源设计、信号采集和保护电路等方面,突出了高效、可靠的硬件设计。此外,文中还分享了许多量产级设计的经验和优化技巧,如死区时间处理、MOSFET选型、PCB布局、EMI优化等。方案优势包括高集成度、高效性、高可靠性和低成本。 适合人群:从事电动汽车电机控制系统设计与开发的技术人员,尤其是有一定嵌入式开发经验和电机控制背景的研发人员。 使用场景及目标:①帮助开发者快速掌握FOC算法及其在电动汽车低速车60V平台的应用;②提供详细的硬件设计指南,确保系统稳定性和可靠性;③通过量产级设计经验分享,提升产品性能和降低成本。 其他说明:本文不仅提供了理论和技术细节,还包括许多实际应用中的优化技巧和注意事项,有助于缩短开发周期并提高产品质量。
JavaFX实战:从零到一,构建你的第一个点击放置(Clicker/Idle)游戏完整代码
程序设计语言基础JAVAWEB_微机Java试卷(A卷(精选))[2025网盘版.备考复习]
程序设计语言基础JAVAWEB_java项目总结[2025网盘版.备考复习]
以微电网为例的能源管理系统simulink仿真模型优化与预测 联系方式
本书由Monika Mangla博士、Ashok Kumar博士、Vaishali Mehta博士、Megha Bhushan博士和Sachi Nandan Mohanty博士联合编辑,首次出版于2022年。书中详细探讨了物联网在现实生活中的应用,面临的挑战以及技术的最新进展。编辑们分别来自不同的学术背景,拥有丰富的教学和研究经验,他们的贡献为本书提供了坚实的理论基础和实践指导。书中内容涵盖了物联网、云计算、网络安全、算法优化、位置建模、机器学习、数据挖掘等多个领域,不仅适合学术研究人员,也为工业界的专业人士提供了宝贵的参考资料。本书的出版旨在为读者提供一个全面了解物联网技术及其应用的平台。
内容概要:本文详细介绍了基于TI DSP和开源FOC框架实现的永磁同步电机(PMSM)电阻、电感和磁链常数的高精度快速辨识方法。文章从引言出发,阐述了这些参数对FOC控制的重要意义,接着分别讲解了电阻、电感和磁链的辨识原理及其具体的代码实现。电阻辨识通过固定电压矢量和欧姆定律计算得出;电感辨识则利用高频旋转电压矢量和感抗公式计算;磁链辨识需要电机旋转并通过电压电流模型计算。此外,文中还提到了基于TI开源FOC框架的优势,如减少开发工作量并提高系统稳定性。最后,作者分享了一些实践经验,如移植到STM32时遇到的问题及解决方案,以及实测数据的表现。 适合人群:从事电机控制系统开发的技术人员,尤其是对PMSM控制有研究兴趣的研发人员。 使用场景及目标:适用于需要精确控制PMSM的应用场合,如工业自动化设备、电动汽车等领域。主要目标是提高FOC控制的精度和效率,确保电机运行的稳定性和可靠性。 其他说明:文中提供的代码片段和实践经验有助于读者更好地理解和应用这一技术,同时强调了参数辨识在电机控制中的重要性。