82进程清理widget逻辑的实现

来源:互联网 发布:sql查询分析器在哪 编辑:程序博客网 时间:2024/05/22 07:50

我们需要实现的是:

桌面widget三秒钟更新一下进程个数和可用内存的信息,然后点击“一键清理”按钮的时候,清理后台进程。

第一步:

更新桌面widget,由于在后台执行任务,所以,由service完成,在service中使用Timer和TimerTask一起来完成三秒钟更新一次的任务。

第二步:

那么在MyWidget什么时候启用这个服务呢?

package com.ustc.mobilemanager.widget;import com.ustc.mobilemanager.service.UpdateWidgetService;import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.Context;import android.content.Intent;/** *  * 最短的更新时间为半小时 *  * @author  * */public class MyWidget extends AppWidgetProvider {@Overridepublic void onReceive(Context context, Intent intent) {System.out.println("onReceive");super.onReceive(context, intent);}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {System.out.println("onUpdate");//修改从设置那里杀死UpdateWidgetService的BUGIntent intent = new Intent(context, UpdateWidgetService.class);context.startService(intent);super.onUpdate(context, appWidgetManager, appWidgetIds);}@Overridepublic void onEnabled(Context context) {System.out.println("onEnabled");Intent intent = new Intent(context, UpdateWidgetService.class);context.startService(intent);super.onEnabled(context);}@Overridepublic void onDisabled(Context context) {System.out.println("onDisabled");Intent intent = new Intent(context, UpdateWidgetService.class);context.stopService(intent);super.onDisabled(context);}}

观察Log的打印,我们选择在onEnabled中启用服务,在onDisabled停止服务。

第四步:

设置两个文本的值:

// 设置更新的组件ComponentName provider = new ComponentName(UpdateWidgetService.this, MyWidget.class);// A class that describes a view hierarchy that can be displayed// in another process. The hierarchy is inflated from a layout// resource file, and this class provides some basic operations// for modifying the content of the inflated hierarchyRemoteViews views = new RemoteViews(getPackageName(),R.layout.process_widget);views.setTextViewText(R.id.process_count,"正在运行进程:"+ SystemInfoUtils.getRunningProcessCount(getApplicationContext())+ "个");long size = SystemInfoUtils.getAvailMem(getApplicationContext());views.setTextViewText(R.id.process_memory,"可用内存:"+ Formatter.formatFileSize(getApplicationContext(), size));

第五步:

处理按钮的点击事件,这里使用广播完成:

// 描述一个动作,这个动作是由另外一个应用程序执行的// 自定义一个广播事件,杀死后台的进程Intent intent = new Intent();intent.setAction("com.ustc.mobilemanager.KILLALL");PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);views.setOnClickPendingIntent(R.id.btn_clear, pendingIntent);awm.updateAppWidget(provider, views);


package com.ustc.mobilemanager.receiver;import java.util.List;import android.app.ActivityManager;import android.app.ActivityManager.RunningAppProcessInfo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class KillAllReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {System.out.println("桌面widget的按钮的点击事件的自定义广播接受到了");ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);List<RunningAppProcessInfo> infos = am.getRunningAppProcesses();for (RunningAppProcessInfo info : infos) {am.killBackgroundProcesses(info.processName);}}}




0 0
原创粉丝点击