安卓widget的详解
来源:互联网 发布:vmware 桥接网络 编辑:程序博客网 时间:2024/05/17 06:23
第一步:先写一个类,继承于AppwidgetProvider,这个类的父类还是BroadCastReceiver
//AppWidgetProvider实际上是一个广播, //继承了它,所以要去清单文件上注册,至于怎么注册,监听哪个动作,直接去开发文档上复制public class myWidgetBroadCastReceiver extends AppWidgetProvider {ActivityManager am;@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stub//Log.i("huang", "onReceive");super.onReceive(context, intent);}}//按照广播的更新周期时间值多少来调用@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {// TODO Auto-generated method stubsuper.onUpdate(context, appWidgetManager, appWidgetIds);//Log.i("huang", "onUpdate");context.startService(new Intent(context, WidgetServerce.class));}//第一次被揪到屏幕上的时候调用@Overridepublic void onEnabled(Context context) {// TODO Auto-generated method stubsuper.onEnabled(context);Log.i("huang", "onEnabled");context.startService(new Intent(context, WidgetServerce.class));}//在屏幕上的最后一个widget被移除的时候调用@Overridepublic void onDisabled(Context context) {// TODO Auto-generated method stubsuper.onDisabled(context);context.stopService(new Intent(context, WidgetServerce.class));Log.i("huang", "onDisabled");}}
第二步:因为是广播,当然要到清单文件里去注册了,要怎么注册呢?不知道,那就去开 发文档的Dev Guide页面瞧一瞧,然后直接把=拷贝过来改一改
<!--widget的广播 --> <receiver android:name="com.example.mobilsafe.widget.myWidgetBroadCastReceiver" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/example_appwidget_info" /> </receiver>
第三步:在清单文件上注册的时候,
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/example_appwidget_info" />
这个节点里需要一个widget的配置信息,我们就去res目录下创建一个xml文件夹,
在xml文件夹里面创建一个保存配置的文件,配置要怎么写呢?不知道,同样的, 去开发文档里面拷贝
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/activity_main_widget" android:minHeight="72dp" android:minWidth="294dp" android:updatePeriodMillis="86400000" ></appwidget-provider>
第四步:在写widget配置的时候,有一个设置初始布的属性
android:initialLayout="@layout/activity_main_widget"
在这个属性里面写对应的布局文件即可,这样这个widget就创建完成了
需要注意的是:如果这个程序没widget空间的时候已经部署在手机上了,后来开发完
widget空间在部署到手机上有可能找不到这个widget,需要先将这个程序先卸载
掉,再重新部署(当时在这里卡了半天,都找不到原因)
好了,现在开始上代码了
//第一次被揪到屏幕上的时候调用
//AppWidgetProvider实际上是一个广播, //继承了它,所以要去清单文件上注册,至于怎么注册,监听哪个动作,直接去开发文档上复制public class myWidgetBroadCastReceiver extends AppWidgetProvider {ActivityManager am;@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stub//Log.i("huang", "onReceive");super.onReceive(context, intent);am=(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);if(intent.getAction().equals("Intent.action.zouni")){//Log.i("huang", "一键清理");List<RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();for (RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses) {am.killBackgroundProcesses(runningAppProcessInfo.processName);}}}//按照广播的更新周期时间值多少来调用@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {// TODO Auto-generated method stubsuper.onUpdate(context, appWidgetManager, appWidgetIds);//Log.i("huang", "onUpdate");context.startService(new Intent(context, WidgetServerce.class));}//第一次被揪到屏幕上的时候调用@Overridepublic void onEnabled(Context context) {// TODO Auto-generated method stubsuper.onEnabled(context);Log.i("huang", "onEnabled");//第一次出现在屏幕的时候启动服务context.startService(new Intent(context, WidgetServerce.class));}//在屏幕上的最后一个widget被移除的时候调用@Overridepublic void onDisabled(Context context) {// TODO Auto-generated method stubsuper.onDisabled(context);context.stopService(new Intent(context, WidgetServerce.class));Log.i("huang", "onDisabled");}}
启动的服务,在服务里面实时更新widget的内容
public class WidgetServerce extends Service { Timer timer;TimerTask task;AppWidgetManager awm;ActivityManager am;PackageManager pm;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();pm=getPackageManager();am=(ActivityManager) getSystemService(ACTIVITY_SERVICE);awm=AppWidgetManager.getInstance(WidgetServerce.this);timer=new Timer();//创建一个计时器//计时器要执行的任务task=new TimerTask() {@Overridepublic void run() {// TODO Auto-generated method stub//第二步:将要更新的widget的广播接受类绑定进去ComponentName provider=new ComponentName(WidgetServerce.this, myWidgetBroadCastReceiver.class);//第三步:得到远程view的布局文件,然后就可以开始对子view进行操作RemoteViews views=new RemoteViews(getPackageName(), R.layout.activity_main_widget); //设置文本views.setTextViewText(R.id.tv_widget_ProcessCount, "正在运行的程序:"+getProcesscount()+"个");long memoryinfo[]=MemoryInfoManager.getMemoryinfo(WidgetServerce.this);views.setTextViewText(R.id.tv_widget_MemoryInfo,"可用内存:"+Formatter.formatFileSize(WidgetServerce.this, memoryinfo[0]));Intent it=new Intent();it.setAction("Intent.action.zouni");PendingIntent pi=PendingIntent.getBroadcast(WidgetServerce.this, 0, it, 0);//设置点击事件,并指定一个广播,当点击的时候,widget的广播接收类就会接收到这个广播,当然必须得先注册views.setOnClickPendingIntent(R.id.but_widget_KillAll, pi);//第一步:第一个参数是指要更新哪个widget,将其widget的广播接受类绑定进去,//第一个参数是要更新的widget的对象的view对象,是个远程的viewawm.updateAppWidget(provider, views);}};timer.schedule(task, 0, 300);}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();task.cancel();task=null;timer.cancel();timer=null;}/** * 获取正在运行的线程数 * @return */private int getProcesscount(){int ProcessCount=0;List<RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();for (RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses) {try {pm.getApplicationInfo(runningAppProcessInfo.processName, 0);ProcessCount++;} catch (NameNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return ProcessCount;}}
0 0
- 安卓widget的详解
- 【安卓笔记】Widget
- 安卓常用 widget
- Android中widget的应用【安卓源码解析三】
- Android时钟的widget【安卓进化三十七】
- android app widget,安卓桌面小工具的使用
- Android中widget的应用【安卓源码解析三】
- 实现安卓widget不被kill的方法
- Widget的简单使用详解
- 安卓桌面小控件App Widget
- 安卓开发之 App Widget
- 安卓android.support.v4.widget.SwipeRefreshLayout
- Android Widget 开发详解(二) +支持listView滑动的widget
- Android Widget 开发详解(二) +支持listView滑动的widget
- 安卓定制软件桌面(launch)上预置特定程序的widget
- Widget详解
- Widget详解
- Android中Widget的开发详解
- Window7 家庭版 IIS 配置
- linux文件结构
- GCD编程(封装GCD)
- RS232
- linux文件目录权限
- 安卓widget的详解
- iOS在当前视图中推出另外一个背景透明的视图控制器
- python AVLTree
- binary search
- 使用LUA CAPI调用LUA匿名闭包
- IOS 多线程 RUNLOOP 机制 (一)
- 卷积神经网络CNN
- SQL语句的划分--SQL笔记
- @AssociationOverrides @AttributeOverride @AttributeOverride