Android项目实战--手机卫士32--给清理进程添加一个Widget
2013-10-25 08:08
701 查看
上一次,我们已经完成了当用户锁屏的时候,就清理一下内存,那么今天,人们就把清理内存的这个功能给加到Widget里面去,
首先,先给大家讲一下Widget,widget就是运行在桌面上的小部件啦,由于运行在不同桌面(Android 的桌面有很多,如launch, 还有小米的米UI还有其他的定制机的呢)上,它的生命周期都会有所不同的,所以我这里就不说出来混淆大家啦,大家可以自己重写它里面的方法,观察一下就知道的啦
但是,要告诉大家,Widget第一次创建的时候,都会调用onEnable方法,然后,当桌面上已经没有这个Widget的时候,那就会调用onDisabled方法
好,下面先来看看,我们要做成的效果
这个界面比较的难看,大家可以自己定义一个好看的界面,这样子,看起来变好很多的啦
要把我们一键清理这个功能做成一个Widget,其实也很简单的
首先,我们就要写一个类ProcessWidget,来继承AppWidgetProvider,其实这个AppWidgetProvider它也是继承了BroadcastReceiver的,也就是说,它也是一个广播接收者来的,既然是一个广播接收者,那么,肯定就是要到AndroidMainfest里面注册它的啦
但是在注册之前,我们还有一件事要处理的,那就是在xml目录下面,定义一个xml文件,来指定一些Widget的信息
process_widget_info.xml
上面我们指定了widget的布局文件啦,这个布局文件就是Widget显示出来的模样啦,我就不粘出来啦,大家可以下载来看看,还有最小的高度啦,最小的宽度啦,还有最后一个就是刷新的时间间隔啦,这里我们写了0,但我们后面会在代码里面用一个计时器来控制刷新的
写完这个文件之后,我们就可以去AndroidMainfest文件里面注册这个Widget啦
就这样子,我们的Widget就注册完成的啦,那么接下来,我们就来写一下Widget要做的事啦
因为我们的Widget是清理进程,那么,还要读取进程的东西,这是一个耗时的操作,所以我们就定义一个服务来处理这些事
com.xiaobin.security.service.UpdateWidgetService
上面的代码都有很详细的注释啦,大家可以看看,有不明白的可以问一下,
在这里,我要提醒一下大家,在我用的Android2.3的模拟器里面,那个Widget的显示是有问题的,所有我后来才换了4.1的模拟器来测试,所有大家发现如果Widget显示有问题,可以,换一下模拟器,
还有一个要注意的是,我们上面是通过PendingIntent来发送一个广播嘛,然后通过接收这条广播来进程清理内存,照理说我们已经有一个LockScreenReceiver的广播接收者来清理进程的啦,完全就可以发一条广播给它的,然后它就调用receiver方法来清理进程,但是,我在测试的时候发现不行的,我还在真机上,两个不同版本的模拟器上测试过,都是不行的,所以我们在这里就自己新写了一个广播接收者,它里面也很简单,就是清理一下进程而已,大家如果知道为什么发送给LockScreenReceiver不行的话,可以告诉我,我当时在这里测试了2,3个小时,都不行
com.xiaobin.security.receiver.ProcessClearReceiver
大家不要忘记了还要注册这个广播接收者的
好啦,既然我们的服务写好啦,那么,我们就要控制它的开启与关闭啦
那么我们回到我们的 ProcessWidget类里面,我们重写它的onEnable和onDelete方法
com.xiaobin.security.receiver.ProcessWidget
上面我说过,不同的桌面,Widget的生命周期是有可能不同的,而且我上面也说啦,在Android2.3的模拟器里面,Widget显示是有问题的,我花了很长时间,发现,其实它是没有执行onEnable这个方法的,也就是说在Android2.3这个模拟器里面,它的生命同期是没有onEnable的,这应该是模拟器的一个bug来的,一般不可能会没有onEnable方法的,所以我们就要onEnable方法开启服务,当widget删除的时候,关闭服务
好啦,就这样子,我们的这个添加Widget的功能就完成的啦,那么我们的进程管理也完成的啦,还有很多的细节和优化,大家可以自己去做一下,下一次,我们就进行的流量管理的功能啦
最后,和大家说一下
为了方便大家的交流,我创建了一个群,这样子大家有什么疑问也可以在群上交流
群号是298440981
今天源码下载
首先,先给大家讲一下Widget,widget就是运行在桌面上的小部件啦,由于运行在不同桌面(Android 的桌面有很多,如launch, 还有小米的米UI还有其他的定制机的呢)上,它的生命周期都会有所不同的,所以我这里就不说出来混淆大家啦,大家可以自己重写它里面的方法,观察一下就知道的啦
但是,要告诉大家,Widget第一次创建的时候,都会调用onEnable方法,然后,当桌面上已经没有这个Widget的时候,那就会调用onDisabled方法
好,下面先来看看,我们要做成的效果
这个界面比较的难看,大家可以自己定义一个好看的界面,这样子,看起来变好很多的啦
要把我们一键清理这个功能做成一个Widget,其实也很简单的
首先,我们就要写一个类ProcessWidget,来继承AppWidgetProvider,其实这个AppWidgetProvider它也是继承了BroadcastReceiver的,也就是说,它也是一个广播接收者来的,既然是一个广播接收者,那么,肯定就是要到AndroidMainfest里面注册它的啦
但是在注册之前,我们还有一件事要处理的,那就是在xml目录下面,定义一个xml文件,来指定一些Widget的信息
process_widget_info.xml
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/process_widget" android:minHeight="72dp" android:minWidth="294dp" android:updatePeriodMillis="0"> </appwidget-provider>
上面我们指定了widget的布局文件啦,这个布局文件就是Widget显示出来的模样啦,我就不粘出来啦,大家可以下载来看看,还有最小的高度啦,最小的宽度啦,还有最后一个就是刷新的时间间隔啦,这里我们写了0,但我们后面会在代码里面用一个计时器来控制刷新的
写完这个文件之后,我们就可以去AndroidMainfest文件里面注册这个Widget啦
<receiver android:name="com.xiaobin.security.receiver.ProcessWidget"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/process_widget_info"/> </receiver>
就这样子,我们的Widget就注册完成的啦,那么接下来,我们就来写一下Widget要做的事啦
因为我们的Widget是清理进程,那么,还要读取进程的东西,这是一个耗时的操作,所以我们就定义一个服务来处理这些事
com.xiaobin.security.service.UpdateWidgetService
package com.xiaobin.security.service; import java.util.Timer; import java.util.TimerTask; import android.app.PendingIntent; import android.app.Service; import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.Intent; import android.os.IBinder; import android.widget.RemoteViews; import com.xiaobin.security.R; import com.xiaobin.security.receiver.ProcessClearReceiver; import com.xiaobin.security.utils.ProcessUtil; public class UpdateWidgetService extends Service { private Timer timer; private TimerTask timerTask; private AppWidgetManager appWidgetManager; private ComponentName componentName; private RemoteViews remoteViews; private Intent intent; private PendingIntent pendingIntent; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { // 拿到一个AppWidgetManager对象 appWidgetManager = AppWidgetManager .getInstance(getApplicationContext()); // 拿到一个ComponentName对象 componentName = new ComponentName("com.xiaobin.security", "com.xiaobin.security.receiver.ProcessWidget"); // 就是显示到桌面上的界面啦,所有布局是我们写的那个widget的布局 remoteViews = new RemoteViews("com.xiaobin.security", R.layout.process_widget); // 这个intent是用来启动一个广播的,因为我们的winget是一键清理的嘛 // 所以我们现在只要发送一条广播就可以调用里面的清理方法啦 // 但我这里就不做啦,大家可以自己试试 intent = new Intent(UpdateWidgetService.this, ProcessClearReceiver.class); // 拿到一个PendingIntent对象,来发送一条广播 pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0); // java传统的计时器 timer = new Timer(); timerTask = new TimerTask() { @Override public void run() { //这里就没设置的们的process_widget这个布局文件里面的内容的啦 //第一个参数就是设置的那个控件的id啦 remoteViews.setTextViewText(R.id.tv_process_count, "进程数目:" + ProcessUtil.getProcessCount(getApplicationContext())); remoteViews.setTextViewText(R.id.tv_process_memory, "可用内存:" + ProcessUtil.getAvailMemory(getApplicationContext())); //这个就是给按钮加上点击事件啦 remoteViews.setOnClickPendingIntent(R.id.bt_clear, pendingIntent); //更新widget里面的内容 appWidgetManager.updateAppWidget(componentName, remoteViews); } }; //开启计时器 timer.scheduleAtFixedRate(timerTask, 1000, 3000); super.onCreate(); } @Override public void onDestroy() { //取消计时器 timer.cancel(); timer = null; timerTask = null; super.onDestroy(); } }
上面的代码都有很详细的注释啦,大家可以看看,有不明白的可以问一下,
在这里,我要提醒一下大家,在我用的Android2.3的模拟器里面,那个Widget的显示是有问题的,所有我后来才换了4.1的模拟器来测试,所有大家发现如果Widget显示有问题,可以,换一下模拟器,
还有一个要注意的是,我们上面是通过PendingIntent来发送一个广播嘛,然后通过接收这条广播来进程清理内存,照理说我们已经有一个LockScreenReceiver的广播接收者来清理进程的啦,完全就可以发一条广播给它的,然后它就调用receiver方法来清理进程,但是,我在测试的时候发现不行的,我还在真机上,两个不同版本的模拟器上测试过,都是不行的,所以我们在这里就自己新写了一个广播接收者,它里面也很简单,就是清理一下进程而已,大家如果知道为什么发送给LockScreenReceiver不行的话,可以告诉我,我当时在这里测试了2,3个小时,都不行
com.xiaobin.security.receiver.ProcessClearReceiver
package com.xiaobin.security.receiver; import com.xiaobin.security.utils.ProcessUtil; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class ProcessClearReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //清理内存 ProcessUtil.killAllProcess(context); } }
大家不要忘记了还要注册这个广播接收者的
<receiver android:name="com.xiaobin.security.receiver.ProcessClearReceiver"></receiver>
好啦,既然我们的服务写好啦,那么,我们就要控制它的开启与关闭啦
那么我们回到我们的 ProcessWidget类里面,我们重写它的onEnable和onDelete方法
com.xiaobin.security.receiver.ProcessWidget
package com.xiaobin.security.receiver; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; import com.xiaobin.security.service.UpdateWidgetService; public class ProcessWidget extends AppWidgetProvider { private Intent intent; @Override public void onEnabled(Context context) { super.onEnabled(context); //开启服务 intent = new Intent(context, UpdateWidgetService.class); context.startService(intent); } @Override public void onDeleted(Context context, int[] appWidgetIds) { super.onDeleted(context, appWidgetIds); //停止服务 intent = new Intent(context, UpdateWidgetService.class); context.stopService(intent); } }
上面我说过,不同的桌面,Widget的生命周期是有可能不同的,而且我上面也说啦,在Android2.3的模拟器里面,Widget显示是有问题的,我花了很长时间,发现,其实它是没有执行onEnable这个方法的,也就是说在Android2.3这个模拟器里面,它的生命同期是没有onEnable的,这应该是模拟器的一个bug来的,一般不可能会没有onEnable方法的,所以我们就要onEnable方法开启服务,当widget删除的时候,关闭服务
好啦,就这样子,我们的这个添加Widget的功能就完成的啦,那么我们的进程管理也完成的啦,还有很多的细节和优化,大家可以自己去做一下,下一次,我们就进行的流量管理的功能啦
最后,和大家说一下
为了方便大家的交流,我创建了一个群,这样子大家有什么疑问也可以在群上交流
群号是298440981
今天源码下载
相关文章推荐
- Android项目实战--手机卫士28--读取进程的信息并显示出来
- Android项目实战--手机卫士29--杀死后台进程
- Android项目实战--手机卫士27--拿到剩余内存以及正在运行的进程数
- Android项目实战--手机卫士20--拿到已经安装了的程序以及程序管理主界面
- Android项目实战--手机卫士21--运行应用以及美化PopupWindow
- Android项目实战--手机卫士24--程序锁的实现以及逻辑
- Android项目实战--手机卫士13--手机号码归属地的逻辑和数据库的压缩
- Android项目实战--手机卫士18--读取用户的短信内容以及短信备份
- Android项目实战--手机卫士18--读取用户的短信内容以及短信备份
- Android项目实战--手机卫士01--启动界面
- Android项目实战--手机卫士22--卸载和分享功能的完成以及用户及系统应用的切换
- Android项目实战--手机卫士19--短信的恢复
- Android项目实战--手机卫士09--防盗逻辑以及设置向导的完成
- Android项目实战--手机卫士33--ExpandableListView的使用
- Android项目实战--手机卫士16--电话黑名单的增删改查
- Android 项目实战--手机卫士(实现splash)
- Android项目实战--手机卫士14--接电话时显示电话归属地
- Android项目实战--手机卫士26--内容提供者与内容观察者
- Android项目实战--手机卫士12--手机号码归属地查询界面
- Android项目实战--手机卫士24--程序锁的实现以及逻辑