48.两种计时器
CountDownTimer是倒计时计时器,接收的参数是:
millisInFuture:倒计时时间
countDownInterval:接收onTick(long)回调的间隔时间
上面例子是一个文本里面显示30秒倒计时。
Timer:计时器
TimerTask:计时器要执行的任务
Timer timer = new Timer();
TimerTask task = new TimerTask(){
@Override
public void run(){
};
timer.schedule(task, delay, period);
第一个参数是执行的任务;
第二个参数是第一次执行的时候延迟多久,立刻执行设为0;
第三个参数是每隔多长时间更新一下,单位ms。
}
取消计时器:
timer.cancel();task.cancel();timer = null; task = null;
49.锁屏广播事件
锁屏的广播事件是一个特殊的广播事件,在清单文件中配置广播接收者是不会生效的,所以只能在代码里面注册。
广播接收者的IntentFilter为:ACTION_SCREEN_OFF。
50.widget小控件
1.写一个类继承AppWidgetProvider,AppWidgetProvider实际上也是一个广播接收者,所以也需要在清单文件中注册。
复写AppWidgetProvider里的onReceive方法、onUpdate方法、onEnabled方法、onDisabled方法。
只要操作小控件就会产生广播,也就会调用onReceive方法。
onUpdate方法是过一个更新周期时调用此方法。如果用户在设置里面停止服务,此时小控件就不会定时更新了,为了避免这个问题,可以在该方法中写开启定时更新的服务。
onEnabled方法是第一次在桌面上添加小控件时调用的方法。可以在该方法中开启定时更新的服务。
onDisabled方法是最后一个小控件被删除时调用的方法。可以在该方法中停止定时更新的服务。
2.在清单文件中注册,并指定小控件的原始数据:
3.创建小控件的原始数据,小控件的原始数据文件要放到res目录下的xml文件夹中:
上面的参数分别是:
小控件的最小宽度、最小高度、更新周期(单位是毫秒,最小值是30分钟,小于最小值时默认都是30分钟)、添加前widget的预览图片(如果不写,默认用应用程序的图标)、小控件初始布局、后面4个参数都可删除。
为了解决更新周期长的问题,可以自己写代码更新小控件。写到一个服务里面,利用Timer、TimerTask更新。
public void onCreate() { awm = AppWidgetManager.getInstance(this); timer = new Timer(); task = new TimerTask() { @Override public void run() { // 设置更新的组件 ComponentName provider = new ComponentName( UpdateWidgetService.this, MyWidget.class); RemoteViews views = new RemoteViews(getPackageName(), R.layout.process_widget); views.setTextViewText(R.id.process_count,"正在运行的进程:"+ SystemInfoUtils.getRunningProcessCount(getApplicationContext())+ "个"); long availMem = SystemInfoUtils.getAvailMem(getApplicationContext()); String size = Formatter.formatFileSize(getApplicationContext(),availMem); views.setTextViewText(R.id.process_memory, "可用内存:" + size); // 描述一个动作,这个动作是由另外一个应用程序执行的。 // 自定义一个广播,杀死后台进程的事件 Intent intent = new Intent("com.uc.mobilesafe.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); super.onCreate(); }