1. 程式人生 > >【Android】一段時間不操作彈出【屏保】效果

【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;

            }
        }
    };
}

至此,仿屏保效果已經完成,很簡單的一個例子,歡迎批評指正,共同學習,共同進步!



相關推薦

Android時間操作效果

仿屏保效果 最近專案的一個小Demo,和大家分享一下,本篇文章主要展示的是一個仿屏保的效果,使用者在一段時間不操作會自動彈出屏保頁面,當處於屏保頁面的時候,【兩秒內連續】按兩次鍵盤【回車鍵】就會退出屏保頁面,效果圖如下: 下面具體介紹一下實現過程: 一 、5秒不操作自動鎖屏介面 這個介面非常簡

解決終端SSH連線伺服器時間操作之後卡死的問題

  卡死是因為LIUNX安全設定問題,在一段時間內沒有使用資料的情況下會自動斷開,解決方法就是讓本地或者伺服器隔一段時間傳送一個請求給對方即可   在本地開啟配置檔案(不建議在server端設定) 1 sudo vim /etc/ssh/ssh_config   新增以下引數,如果有直接修改

解決終端SSH連接服務器時間操作之後卡死的問題

解決方法 服務器 一段 使用 config 方法 color 重啟 ive   卡死是因為LIUNX安全設置問題,在一段時間內沒有使用數據的情況下會自動斷開,解決方法就是讓本地或者服務器隔一段時間發送一個請求給對方即可   在本地打開配置文件(不建議在server端設置)

阿里雲ECS進行ssh時,時間操作就自動斷開連線的解決方法

vim /etc/ssh/sshd_config 找到以下兩項配置 #ClientAliveInterval 0 #ClientAliveCountMax 3 修改為 ClientAliveInterval 30 ClientAliveCountMax 86400

Android APP時間操作顯示屏

     開發環境為eclipse,因為demo簡單就沒有使用android studio,android studio每次執行都要gradle編譯一次,速度慢。       專案需要,做了一個Android TV 視訊播放器的屏保,大概的需求就是app在沒有播放視訊的情況

android App時間沒有操作或沒有點選幕後廣告,或者時間沒有點選螢幕進行特定操作

android App沒有操作一段時間後彈出屏保廣告頁面 最近做了個專案,裡面有個功能是app在任何activity中沒有操作一段時間後要跳轉到屏保廣告頁面,點選廣告頁面是返回上一個activity中,並且廣告頁面是客戶在後臺設定的多張圖片或者gif。也可以改成是app在沒

android App時間操作返回上介面或其他介面

大體需求就是5分鐘無操作返回主介面   我的第一想法就是有一個倒計時來實現倒計時5分鐘  有一個onTouch事件監測使用者的點選事件 具體實現寫了一個時間的倒計時的工具類 BackMain工具類 public class BackMain extends Coun

android 定時時間執行

有些情況需要隔一段時間去執行某個操作一次或者是每隔一段時間久執行某個操作: 下面是每隔一段時間就執行某個操作,直到關閉定時操作: final Handler handler = new Handler(); Runnable runnable = new Ru

IIS執行時間響應(自動關閉)的解決方法

      查詢事件記錄,提示為應用程式池 'DefaultAppPool' 提供服務的程序關閉時間超過了限制 解決方案: Internet 資訊服務(IIS)管理器->應用程式池->DefaultAppPool->右擊屬性 一、回收 1、回收工作程序(分鐘):選中

JavaScript(1):Js實現web頁面時間操作,退出或關閉頁面

1. 思路 js設定一個倒計時,當監聽到keydown mousemove mousedown等事件時,重置倒計時。若倒計時為0時,觸發相應事件。 2. 實現 注:需要引入JQuery

android 指定時間之後再執行

今日在做仿網易新聞啟動的功能,需要用到按一段時間之後,再淡入一張圖片,就需要用到定時操作,我就採用Handler進行處理,如下: 下面是每隔一段時間就執行某個操作,直到關閉定時操作: final

客戶端時間訪問,第一次訪問資料庫自動斷開連線,重新整理可以正常連線

資料庫應用開發過程中,我們可能會遇到一個問題:應用使用了資料庫連線池,每經過指定時間後,發出到資料庫伺服器的任何請求都會失敗,而且有且僅有一次失敗,之後的正常訪問都沒有問題。尤其是在Web應用中,如果晚上時段沒有訪問,而第二天第一個訪客的經歷就是碰到一個數據庫訪問錯誤,如果開發系統的程式設計師沒有注意這個問

centOS ssh連線 時間操作連線自動斷開問題

我是一名小白,最近在學習時用到了Linux系統,可是遇到了這個問題,經過一段時間終於解決了,在這裡把我解決的方法寫出來,希望可以幫到其他人,如果有那裡寫的不正確的地方,望大家指正,謝謝! 解決方法: 1 修改  /etc/ssh/sshd_config 檔案 執行命

android webview JS對話方塊 解決辦法

文章轉載:http://blog.sina.com.cn/s/blog_4e1e357d0101ds5h.html 寫webView 與JS互動的時候 發現彈出對話方塊  設定了很多還是彈不出來:     webSettings.setJavaScriptEnabled(

spring boot伺服器啟動成功後,過時間會關閉

啟動命令: java -jar yuedaoapi-1.0.0.jar > log.txt 2>&1 & 其中 >log.txt 是把輸出日誌存放到檔案中 2>&1 輸出所有的日誌檔案 & 後臺啟動 但

OpsDev解決mac下ssh空閒時間自動斷開的問題

在macbook中使用終端, 通過ssh連線上遠端伺服器後, 隔一段時間沒有資料傳遞時會自動斷開,而表象就是終端會卡著無響應,要等幾分鐘後才會顯示斷開並且返回到本地終端命令列。這個問題太影響流暢性和心

解決網站執行時間後就無法訪問,重啟Tomcat才能恢復

【背景】重新部署了網站,執行環境是Linux(centOS6.5)+Tomcat7+mysql5,作了相關安全配置和系統優化工作; 【問題】執行幾天後,出現了網站無法訪問的現象,具體是進入網站首頁時頁面呈現空白狀態,網站ping值也很不穩定; 檢視tomcat訪問日誌,發現

springboot做的controller服務,每隔時間後第一次請求耗時特別長遇到有待驗證

1、在訪問任何一個介面後,此介面在短時間內訪問速度都很正常。但就是在每隔一段時間後(大概幾秒)第一個請求訪問速度很慢,客戶端顯示耗

經驗電腦長時間關機導致的無法開機問題

啟動菜單 但是 can win7 一段 分鐘 硬盤 size 開機 本來不打算寫電腦掛掉這種問題的記錄,但是我這個問題比較特殊還遇到兩次,直接送電腦店可能會說主板掛了,返廠檢修之類的,對於緊急用電腦的人來說是不可接受的,其實分分鐘就可以解決。 1.環境:用了7年的宏碁475

centos6.8 apache執行時間 訪問了的情況(已解決)

網站突然一下子訪問不了了  第一反應 重啟apache 恢復正常 後續工作就是排查原因  tail -100 error_log [Fri Sep 28 11:20:43 2018] [error] server reached MaxClients setting,