83屏幕锁屏时,widget不再更新(省电优化)

前面的代码在屏幕锁屏时,还在每隔三秒更新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();
		}

	}

}

结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值