当前位置: 代码迷 >> Android >> 【Android】一段时间不操作弹出【屏保】成效
  详细解决方案

【Android】一段时间不操作弹出【屏保】成效

热度:48   发布时间:2016-04-28 00:19:12.0
【Android】一段时间不操作弹出【屏保】效果

仿屏保效果

最近项目的一个小Demo,和大家分享一下,本篇文章主要展示的是一个仿屏保的效果,用户在一段时间不操作会自动弹出屏保页面,当处于屏保页面的时候,【两秒内连续】按两次键盘【回车键】就会退出屏保页面,效果图如下:

这里写图片描述

下面具体介绍一下实现过程:

一 、5秒不操作自动锁屏界面

这个界面非常简单,就一个TextView,直接贴代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity" >      <TextView          android:id="@+id/start"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:layout_centerInParent="true"         android:textSize="30sp"         android:gravity="center"         android:textStyle="bold"         android:textColor="#698048"         android:text="5秒不操作自动锁屏"          /></RelativeLayout>

二 、具体实现逻辑

首先看MainPresenter类,是计时具体的实现逻辑类,主要是通过Runnable来实现操作,当无操作时5秒后会执行Runnable,跳转到锁屏界面,5秒内有操作会重置计时,具体代码如下:

public class MainPresenter{    public final static int MSG_SHOW_TIPS = 0x01;    private IMainView mMainView;    private MainHandler mMainHandler;    private boolean tipsIsShowed = true;    private Runnable tipsShowRunable = new Runnable()    {        @Override        public void run()        {            mMainHandler.obtainMessage(MSG_SHOW_TIPS).sendToTarget();        }    };    public MainPresenter(IMainView view)    {        mMainView = view;        mMainHandler = new MainHandler();    }    /**     *      * <无操作时开始计时>     * <功能详细描述>     *      * @see [类、类#方法、类#成员]     */    public void startTipsTimer()    {        mMainHandler.postDelayed(tipsShowRunable, 5000);    }    /**     *      * <结束当前计时,重置计时>     * <功能详细描述>     *      * @see [类、类#方法、类#成员]     */    public void endTipsTimer()    {        mMainHandler.removeCallbacks(tipsShowRunable);    }    public void resetTipsTimer()    {        tipsIsShowed = false;        mMainHandler.removeCallbacks(tipsShowRunable);        mMainHandler.postDelayed(tipsShowRunable, 5000);    }    public class MainHandler extends Handler    {        @Override        public void handleMessage(Message msg)        {            super.handleMessage(msg);            switch (msg.what)            {                case MSG_SHOW_TIPS:                    mMainView.showTipsView();                    tipsIsShowed = true;                    // 屏保显示,两秒内连续按下键盘Enter键可关闭屏保                    break;            }        }    }}

三 、MainActivity.java是主页面

主要功能是重写OnKeyDown方法,监听键盘按下事件,一旦触发键盘事件,就会重置计时,另外在onResume()方法中默认开始计时,showTipsView()方法是计时完成弹出屏保界面。

public class MainActivity extends Activity implements IMainView{    private MainPresenter mPresenter;    protected void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mPresenter = new MainPresenter(this);    }    @Override    public boolean onKeyDown(int keyCode, KeyEvent event)    {        //重置计时        mPresenter.resetTipsTimer();        return false;    }    @Override    protected void onResume()    {        //启动默认开始计时        mPresenter.startTipsTimer();        super.onResume();    }    @Override    protected void onPause()    {        //有其他操作时结束计时        mPresenter.endTipsTimer();        super.onPause();    }    @Override    public void showTipsView()    {        //展示屏保界面        Intent intent = new Intent(MainActivity.this, MyTimeActivity.class);        startActivity(intent);    }}

另外大家看到MainActivity实现了IMainView接口,IMainView很简单,就封装了一个showTipsView()方法,MainActivity实现了该方法而已,IMainView.java代码如下。

public interface IMainView{    public void showTipsView();}

四 、屏保界面MyTimeActivity.java

MyTimeActivity界面很简单,就是一个背景图,外加一个系统时间显示,还有就是两秒内连续两次按下回车键会退出屏保界面的逻辑,具体代码如下,关键部分都加了注释:

public class MyTimeActivity extends Activity{    private static final int MSGKEY = 0x10001;    private long exitTime = 0;    //屏保右上角的系统时间    private TextView mTime;    @Override    public void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.lock_screen);        mTime = (TextView)findViewById(R.id.mytime);        //启动线程刷新屏保界面右上角的时间        new TimeThread().start();    }    public class TimeThread extends Thread    {        @Override        public void run()        {            do            {                try                {                    //更新时间                    Thread.sleep(1000);                    Message msg = new Message();                    msg.what = MSGKEY;                    mHandler.sendMessage(msg);                }                catch (InterruptedException e)                {                    e.printStackTrace();                }            } while (true);        }    }    /**     * 2秒内连续两次按下回车键退出屏保     * 重写方法     * @param keyCode     * @param event     * @return     * @see android.app.Activity#onKeyDown(int, android.view.KeyEvent)     */    @Override    public boolean onKeyDown(int keyCode, KeyEvent event)    {        if (keyCode == KeyEvent.KEYCODE_ENTER)        {            exit();            return false;        }        return super.onKeyDown(keyCode, event);    }    public void exit()    {        if ((System.currentTimeMillis() - exitTime) > 2000)        {            Toast.makeText(getApplicationContext(), "再按一次解锁键即可进入应用", Toast.LENGTH_SHORT).show();            exitTime = System.currentTimeMillis();        }        else        {            finish();        }    }    private Handler mHandler = new Handler()    {        @Override        public void handleMessage(Message msg)        {            super.handleMessage(msg);            switch (msg.what)            {                case MSGKEY:                    long sysTime = System.currentTimeMillis();                    CharSequence sysTimeStr = DateFormat.format("hh:mm", sysTime);                    mTime.setText(sysTimeStr);                    break;            }        }    };}


至此,仿屏保效果已经完成,很简单的一个例子,欢迎批评指正,共同学习,共同进步!

1楼u010911576昨天 18:11
mvp模式用着还好吗,我也想尝试一下
Re: wangkeke1860昨天 22:06
回复u010911576n挺好的
  相关解决方案