`
wang_peng1
  • 浏览: 3904337 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

屏保的实现

 
阅读更多

最近需要做一个屏保,开始以为很简单,因为系统本身就带了屏保功能,拿出来改改就好,只是后来发现,系统自带的不是和windows 一样的屏保,系统自带的,要么设置完了马上启动,要不就是插电启动,这样容易捕获事件,直接发起一个activity 播放幻灯片好了。但是我现在需要做的是和windows 一样,一段时间内,用户如果没有响应事件,就会发起activity。

 

这个问题的关键就是 怎么捕获 没有响应的事件:有人说 监听屏幕变暗,是个办法,但是我还有一个需求就是用户可以设置一个时间段 比如 10 30分钟没想应 就屏保,那么监听屏幕变暗就不好使了。

有人说  监听touch事件,写一个baseactivity 监听所有,activity,虽然是个办法,但是你只能用在你的程序当中,如果我需要在所有的程序当中呢,比如屏保是在home当中,无论任何程序 无触摸才响应屏保。只要解决这两个问题 就简单多了。

 

那怎么监听 用户没有响应的事件呢?其实很简单,你会发现系统有自带的屏幕设置,可以设置一段时间 让屏幕变暗,方法就是:

 

try {
		                 Settings.System.putInt(getApplicationContext().getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 1000*timeCounter[selectedTimeIndex]*60);
		           
		             } catch (NumberFormatException e) {
		                Log.e("time", "could not persist screen timeout setting", e);
		             }

 这里就完成了第一步,设置那一段时间,在用户没有响应的时候屏幕变黑,我们的需求是屏保,变黑啥用?

这只是间接实现屏保的异步分。当屏幕变黑 就需要监听广播 屏幕变黑,发起屏保就好了:

if(action.equals(Intent.ACTION_SCREEN_OFF)){
//            	
	            	if(!CommonUtil.screenSaveAllBitmapList.isEmpty()){
	            		
//	            		Log.i("time","screen off");
		            	

	            		powerManager=(PowerManager)getSystemService(Context.POWER_SERVICE);
	            		WakeLock wl =  powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK
	                            | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "AlarmClock");
	            		wl.acquire();
	            		
	            			
	            	    Intent powerPointintent = new Intent(PageActivity.this,PowerPointActivity.class);
					    startActivity(powerPointintent);
				
						wl.release();
	              
            	}

 检查数组为空,是因为屏幕变黑是个系统事件,为了防止每次发起屏保,只要将幻灯片的图片设置为空就好了。

 

现在就完成了功能,不过不要太高兴,到这里你发现,在一段时间内确实屏保了,但是屏幕依旧是暗的,没有唤醒,当你用手点击屏幕的时候,发现幻灯片已经再播了,也就说,屏保的功能实现了,只是屏幕没亮,

需要在播放幻灯片的activity 下面:

	setContentView(R.layout.powerpoint_main);
		
      final Window win = getWindow();
      win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
              | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
      // Turn on the screen unless we are being launched from the AlarmAlert
      // subclass as a result of the screen turning off.
      if (!getIntent().getBooleanExtra("screen_off", false)) {
          win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                  | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                  | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
      }

 哈哈 最后别忘了权限

  <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>

 原理就是这样,可能不同需求 实现方法不同需要自己修改。因为我的是launcher 所有不需要什么服务一直监听屏幕变暗,如果你享做单独的程序,应该用服务了。所有不要没事总说别人的代码不好用,因为所用的环境不同,对于这样的问题 我也不解答。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics