第一步:先写一个类,继承于AppwidgetProvider,这个类的父类还是BroadCastReceiver
//AppWidgetProvider实际上是一个广播,
//继承了它,所以要去清单文件上注册,至于怎么注册,监听哪个动作,直接去开发文档上复制
public class myWidgetBroadCastReceiver extends AppWidgetProvider {
ActivityManager am;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
// Log.i("huang", "onReceive");
super.onReceive(context, intent);
}
}
//按照广播的更新周期时间值多少来调用
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// TODO Auto-generated method stub
super.onUpdate(context, appWidgetManager, appWidgetIds);
// Log.i("huang", "onUpdate");
context.startService(new Intent(context, WidgetServerce.class));
}
//第一次被揪到屏幕上的时候调用
@Override
public void onEnabled(Context context) {
// TODO Auto-generated method stub
super.onEnabled(context);
Log.i("huang", "onEnabled");
context.startService(new Intent(context, WidgetServerce.class));
}
//在屏幕上的最后一个widget被移除的时候调用
@Override
public void onDisabled(Context context) {
// TODO Auto-generated method stub
super.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;
@Override
public 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);
}
}
}
//按照广播的更新周期时间值多少来调用
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// TODO Auto-generated method stub
super.onUpdate(context, appWidgetManager, appWidgetIds);
// Log.i("huang", "onUpdate");
context.startService(new Intent(context, WidgetServerce.class));
}
//第一次被揪到屏幕上的时候调用
@Override
public void onEnabled(Context context) {
// TODO Auto-generated method stub
super.onEnabled(context);
Log.i("huang", "onEnabled");
//第一次出现在屏幕的时候启动服务
context.startService(new Intent(context, WidgetServerce.class));
}
//在屏幕上的最后一个widget被移除的时候调用
@Override
public void onDisabled(Context context) {
// TODO Auto-generated method stub
super.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;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
pm=getPackageManager();
am=(ActivityManager) getSystemService(ACTIVITY_SERVICE);
awm=AppWidgetManager.getInstance(WidgetServerce.this);
timer=new Timer();//创建一个计时器
//计时器要执行的任务
task=new TimerTask() {
@Override
public 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对象,是个远程的view
awm.updateAppWidget(provider, views);
}
};
timer.schedule(task, 0, 300);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.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 block
e.printStackTrace();
}
}
return ProcessCount;
}
}