这两天工作比较忙,没有时间更新博客。今天难得闲下来,总结一下之前写的一个Demo,用到了两个小知识点:一是使用Thread加Handler实现计时,二是控制屏幕唤醒不熄灭。

首先是计时,首先我使用单纯的Handler来实现计时,代码如下:

Handler handler = new Handler();    Runnable runnable = new Runnable() {        @Override        public void run() {            timeSec ++;            mTimeCount.setText("" + timeSec);            handler.postDelayed(this, 1000);        }    };

但是这样有个弊端,当我的主线程里有Thread.Sleep延时操作时,这个时候计时就会暂停。所以需要在另外一个Thread里来进行计时:

new Thread(new TimeThread()).start();final Handler handler = new Handler() {                 public void handleMessage(Message msg) {            switch (msg.what) {                case 1:                    timeSec++;                    if (timeSec < 60) {  // 1分钟以下情况                        mTimeCount.setText("总耗时:" + timeSec + "秒");                    } else if (timeSec < 3600) {  // 1小时以下情况                        int minutes = timeSec / 60;                        int second = timeSec % 60;                        mTimeCount.setText("总耗时:" + minutes + "分" + second + "秒");                    } else {                        int hours = timeSec / 3600;                        int minutes = (timeSec - hours * 3600) / 60;                        int second = timeSec % 60;                        mTimeCount.setText("总耗时:" + hours + "时" + minutes + "分" + second + "秒");                    }            }            super.handleMessage(msg);        }    };
这样UI在阻塞时,虽然我们的mTimeCount这个TextView没有实时更新,但是计时函数还是在进行的,当UI线程的Thread.Sleep()结束时,就会更新。


下面看一下保持屏幕唤醒的逻辑:

private static PowerManager.WakeLock wakeLock;

  public static void keepScreenOn(Context context, boolean on) {        if (on) {            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);            wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "==KeepScreenOn==");            wakeLock.acquire();        } else {            if (wakeLock != null) {                wakeLock.release();                wakeLock = null;            }        }    }

在应用destory的时候得把wakeLock给release掉:

  @Override    protected void onDestroy() {        super.onDestroy();        keepScreenOn(Main.this, false);    }

Android中通过各种Lock锁对电源进行控制,需要注意的是加锁和解锁必须成对出现。
//启用屏幕常亮功能PowerManager pm =(PowerManager) getSystemService(POWER_SERVICE);wakeLock= pm.newWakeLock(PowerManager.FULL_WAKE_LOCK| PowerManager.ACQUIRE_CAUSES_WAKEUP,myPowerManager.TAG);wakeLock.acquire();//关闭 屏幕常亮功能if (wakeLock != null) {wakeLock.release();} 


需要注意的是,需要在mainfest权限获取
要进行电源的操作需要在AndroidManifest.xml中声明该应用有设置电源管理的权限。


另外,根据flags不同的值,实现不同级别的电源管理。
关于int flags 各种锁的类型对CPU 、屏幕、键盘的影响:
PARTIAL_WAKE_LOCK :保持CPU 运转,屏幕和键盘灯有可能是关闭的。
SCREEN_DIM_WAKE_LOCK :保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯
SCREEN_BRIGHT_WAKE_LOCK :保持CPU 运转,允许保持屏幕高亮显示,允许关闭键盘灯

FULL_WAKE_LOCK :保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度.


转载请注明出处:周木水的CSDN博客 http://blog.csdn.net/zhoumushui


更多相关文章

  1. Android中onSaveInstanceState和onRestoreInstanceState的调用
  2. 使用DialogFragment遇到的一些问题
  3. Android倒计时神器(CountDownTimer)
  4. Android(安卓)布局单位转换
  5. Android之控件保持在软键盘上面
  6. Android(安卓)WebView加载页面的输入框被软键盘遮挡的问题
  7. Android(安卓)launcher3布局和结构
  8. 用Eclipse编译android程序时,出现警告This text field does not
  9. Android(安卓)屏幕(View)坐标系统

随机推荐

  1. 如何将svn上checkout下来的android 程序
  2. 【OSC手机App技术解析】- Android完全退
  3. android应用程序的安装位置
  4. Android(安卓)IPC 通讯机制源码分析
  5. Android(安卓)SDCard Filesystem
  6. android selector 背景选择器
  7. Android中的File文件存储及读取file中的B
  8. android 隐藏API 在源码下编译报错cannot
  9. android sdk中的工具
  10. Android创建隐藏文件或者文件夹