83屏幕锁屏时,widget不再更新(省电优化)
2014-12-25 21:43
330 查看
前面的代码在屏幕锁屏时,还在每隔三秒更新widget,这样比较耗电。
解决的办法是注册两个广播接收者,当接收到锁屏时,停止更新,当接收到解锁时,开始更新。
完整的代码:
结果:
解决的办法是注册两个广播接收者,当接收到锁屏时,停止更新,当接收到解锁时,开始更新。
private class ScreenOffReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.i(TAG, "屏幕锁屏啦!停止Timer的更新"); stopTimer(); } } private class ScreenOnReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.i(TAG, "屏幕解锁啦!开始Timer的更新"); startTimer(); } }
private void stopTimer() { if (timer != null && task != null) { timer.cancel(); task.cancel(); task = null; timer = null; } }
private void startTimer() { if (timer == null && task == null) { timer = new Timer(); task = new TimerTask() { @Override public void run() { Log.i(TAG, "更新widget"); // 设置更新的组件 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 hierarchy RemoteViews 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); } }; timer.schedule(task, 0, 3000); } }
完整的代码:
package com.ustc.mobilemanager.service;
import java.util.Timer;
import java.util.TimerTask;
import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.text.format.Formatter;
import android.util.Log;
import android.widget.RemoteViews;
import com.ustc.mobilemanager.R;
import com.ustc.mobilemanager.utils.SystemInfoUtils;
import com.ustc.mobilemanager.widget.MyWidget;
public class UpdateWidgetService extends Service {
private ScreenOffReceiver offReceiver;
private ScreenOnReceiver onReceiver;
protected static final String TAG = "UpdateWidgetService";
private Timer timer;
private TimerTask task;
/**
* Widget管理器
*/
private AppWidgetManager awm;
@Override
public void onCreate() {
onReceiver = new ScreenOnReceiver();
offReceiver = new ScreenOffReceiver();
registerReceiver(onReceiver, new IntentFilter(Intent.ACTION_SCREEN_ON));
registerReceiver(offReceiver,
new IntentFilter(Intent.ACTION_SCREEN_OFF));
awm = AppWidgetManager.getInstance(this);
startTimer();
super.onCreate();
}
private void startTimer() { if (timer == null && task == null) { timer = new Timer(); task = new TimerTask() { @Override public void run() { Log.i(TAG, "更新widget"); // 设置更新的组件 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 hierarchy RemoteViews 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); } }; timer.schedule(task, 0, 3000); } }
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(onReceiver);
unregisterReceiver(offReceiver);
onReceiver = null;
offReceiver = null;
stopTimer();
}
private void stopTimer() { if (timer != null && task != null) { timer.cancel(); task.cancel(); task = null; timer = null; } }
private class ScreenOffReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.i(TAG, "屏幕锁屏啦!停止Timer的更新"); stopTimer(); } } private class ScreenOnReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.i(TAG, "屏幕解锁啦!开始Timer的更新"); startTimer(); } }
}
结果:
相关文章推荐
- mysql性能优化(五) mysql中SELECT+UPDATE处理并发更新问题解决方案
- WordPress插件 WP Rocket 缓存火箭加速优化插件 [更新至v2.7.4]
- 数据库优化相关(不断更新)
- 智能电网_分布式_网络优化_latest--持续更新
- 成都网站优化公司告诉你百度快照更新频次和排名有什么关系?
- Chrome 扩展程序 CrxMouse Techzero优化版 更新至 v3.0.4
- 博客搬家了,此处不再更新。
- 记一次MYSQL更新优化
- MYSQL更新优化实录
- Android4.0音乐播放器appwidget新增重复播放按钮图片如何于主应用同步更新
- 重开一个博客了,博客园的不再更新了。
- TCP零窗口更新与超时重传联合优化的packetdrill确认
- 苹果推iTunes 11.2.1更新:优化播客
- Win8版必应在线翻译更新了 专为Win8.1优化
- browser-sync 实现前端的热更新,不再手动刷新浏览器
- QTableWidget使用简单,因为不再存在父节点的关系
- 《阿里巴巴Android开发手册》v1.0.1更新,优化部分内容和示例代码
- 做好这五点让你优化企业类网站不再是难事
- 《阿里巴巴Android开发手册》v1.0.1更新,优化部分内容和示例代码
- 《阿里巴巴Android开发手册》v1.0.1更新,优化部分内容和示例代码