Android倒計時CountDownTimer小記,android倒計時

來源:互聯網
上載者:User

Android倒計時CountDownTimer小記,android倒計時

Android 超簡便的倒計時實現:  CountDownTimer

CountDownTimer由系統提供

查資料的時候 發現了CountDownTimer這個類之後 果斷拋棄了以前的倒計時做法


功能:

30秒倒計時 每次間隔1秒


參數:

mc.start();方法開始

mc.cancel();方法結束

new MyCountDownTimer(30000, 1000); 第一個參數表示 總的時間為30000毫秒,間隔1000毫秒



直接上代碼:

package com.example.daojishi;import android.app.Activity;import android.os.Bundle;import android.os.CountDownTimer;import android.util.Log;import android.view.View;import android.widget.TextView;import android.widget.Toast;/** *  * @author baozi *  * 倒計時的類  CountDownTimer *  */public class MainActivity extends Activity {private MyCountDownTimer mc;private TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv = (TextView) findViewById(R.id.show);mc = new MyCountDownTimer(30000, 1000);mc.start();}public void oncancel(View view) {Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_LONG).show();// toast有顯示時間延遲mc.cancel();}public void restart(View view) {Toast.makeText(MainActivity.this, "重新開始", Toast.LENGTH_LONG).show();// toast有顯示時間延遲mc.start();}/** * 繼承 CountDownTimer 防範 *  * 重寫 父類的方法 onTick() 、 onFinish() */class MyCountDownTimer extends CountDownTimer {/** *  * @param millisInFuture *            表示以毫秒為單位 倒計時的總數 *  *            例如 millisInFuture=1000 表示1秒 *  * @param countDownInterval *            表示 間隔 多少微秒 調用一次 onTick 方法 *  *            例如: countDownInterval =1000 ; 表示每1000毫秒調用一次onTick() *  */public MyCountDownTimer(long millisInFuture, long countDownInterval) {super(millisInFuture, countDownInterval);}@Overridepublic void onFinish() {tv.setText("done");}@Overridepublic void onTick(long millisUntilFinished) {Log.i("MainActivity", millisUntilFinished + "");tv.setText("倒計時(" + millisUntilFinished / 1000 + ")...");}}}//┏┓   ┏┓//┏┛┻━━━┛┻┓//┃       ┃  //┃   ━   ┃//┃ ┳┛ ┗┳ ┃//┃       ┃//┃   ┻   ┃//┃       ┃//┗━┓   ┏━┛//┃   ┃   神獸保佑        //┃   ┃   代碼無BUG!//┃   ┗━━━┓//┃       ┣┓//┃       ┏┛//┗┓┓┏━┳┓┏┛//  ┃┫┫ ┃┫┫//  ┗┻┛ ┗┻┛

布局:

<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"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <TextView        android:id="@+id/show"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world" />    <Button        android:id="@+id/button1"        android:onClick="oncancel"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignLeft="@+id/show"        android:layout_below="@+id/show"        android:layout_marginLeft="50dp"        android:layout_marginTop="106dp"        android:text="cancel" />    <Button        android:id="@+id/button2"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignLeft="@+id/button1"        android:layout_below="@+id/button1"        android:layout_marginTop="63dp"        android:onClick="restart"        android:text="restart" /></RelativeLayout>


附: 

CountDownTimer源碼:

/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package android.os;import android.util.Log;/** * Schedule a countdown until a time in the future, with * regular notifications on intervals along the way. * * Example of showing a 30 second countdown in a text field: * * <pre class="prettyprint"> * new CountDownTimer(30000, 1000) { * *     public void onTick(long millisUntilFinished) { *         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000); *     } * *     public void onFinish() { *         mTextField.setText("done!"); *     } *  }.start(); * </pre> * * The calls to {@link #onTick(long)} are synchronized to this object so that * one call to {@link #onTick(long)} won't ever occur before the previous * callback is complete.  This is only relevant when the implementation of * {@link #onTick(long)} takes an amount of time to execute that is significant * compared to the countdown interval. */public abstract class CountDownTimer {    /**     * Millis since epoch when alarm should stop.     */    private final long mMillisInFuture;    /**     * The interval in millis that the user receives callbacks     */    private final long mCountdownInterval;    private long mStopTimeInFuture;    /**     * @param millisInFuture The number of millis in the future from the call     *   to {@link #start()} until the countdown is done and {@link #onFinish()}     *   is called.     * @param countDownInterval The interval along the way to receive     *   {@link #onTick(long)} callbacks.     */    public CountDownTimer(long millisInFuture, long countDownInterval) {        mMillisInFuture = millisInFuture;        mCountdownInterval = countDownInterval;    }    /**     * Cancel the countdown.     */    public final void cancel() {        mHandler.removeMessages(MSG);    }    /**     * Start the countdown.     */    public synchronized final CountDownTimer start() {        if (mMillisInFuture <= 0) {            onFinish();            return this;        }        mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;        mHandler.sendMessage(mHandler.obtainMessage(MSG));        return this;    }    /**     * Callback fired on regular interval.     * @param millisUntilFinished The amount of time until finished.     */    public abstract void onTick(long millisUntilFinished);    /**     * Callback fired when the time is up.     */    public abstract void onFinish();    private static final int MSG = 1;    // handles counting down    private Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            synchronized (CountDownTimer.this) {                final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();                if (millisLeft <= 0) {                    onFinish();                } else if (millisLeft < mCountdownInterval) {                    // no tick, just delay until done                    sendMessageDelayed(obtainMessage(MSG), millisLeft);                } else {                    long lastTickStart = SystemClock.elapsedRealtime();                    onTick(millisLeft);                    // take into account user's onTick taking time to execute                    long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();                    // special case: user's onTick took more than interval to                    // complete, skip to next interval                    while (delay < 0) delay += mCountdownInterval;                    sendMessageDelayed(obtainMessage(MSG), delay);                }            }        }    };}

每日精進 前進一步



android 用 service 與 CountDownTimer 實現一個倒計時器的功可以?

用handler,實現service和住ui thread通訊
 
Android上開發一個長達幾天的倒計時小軟體, 把它做成service? 還是做成可以夠保留在背景Activity?

要看你的功能了
假設不需要中途總是查看這個倒計時,長達幾天的話,可以調用日曆,精確到天(也可以到小時分鐘)之後,收到提醒再起service。由service啟動你要啟動的東西。
如果你中途要查看調整這個倒計時,那你只能用service。加些屬性使它可以長存。如果關機,把時間寫入到檔案或者preference,開機再續計時,只有一些清理程式的軟體能把這個service幹掉。
activity主要用途是顯示頁面,不同於service,android系統喜歡對這類對象進行自動回收。如果你硬要它長存也可以的,設定屬效能讓它存在很長時間。但不建議使用。
android還有一類硬時鐘,可以在關機狀態下也依然計時,並且執行一些程式,你可以google一下。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.