安卓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