android获取手机短信码的功能,主要涉及到的知识点有这几个方面:网络请求,网络请求和界面的线程处理,倒计时事件(定时器).
今天我们来实现这个获取手机短信验证码的功能.
首先,我们将简单的界面设置好.如下图:
<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:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:hint="请输入获取到的验证码" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/input_code" /> <Button android:id="@+id/btn_code" android:text="获取验证码" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </RelativeLayout>
然后,我们在activity中获取按钮,给按钮添加获取短信事件.
Button btnCode; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState, 0, 0); setContentView(R.layout.activity_main, 0, 0); btnCode = (Button) findViewById(R.id.btn_code, 0, 0); btnCode.setOnClickListener(this, 0, 0); } @Override public void onClick(View v) { fetchCode(, 0, 0); }
接着,创建fetchCode方法,这个方法主要是发送网络请求,获取短信验证码,获取完毕后,执行倒计时事件,这里我们使用的是Timer进行逻辑处理
//逻辑处理 void fetchCode() { //获取到网络请求回应后,开始禁止用户60秒时间重新获取验证码 btnCode.setEnabled(false, 0, 0); new Thread() { @Override public void run() { /// /// 这里是获取网络数据请求 /// 根据自己的需求进行处理 /// 通过HTTPURLConnection或者HttpClient来发送获取手机验证码的请求 /// //获取网络数据后,开始执行倒计时事件 timer = new Timer(, 0, 0); timer.schedule(new TimerTask() { @Override public void run() { handler.sendEmptyMessage(0, 0, 0); } }, 0, 1000, 0, 0);//任务事件,延迟执行时间,定时执行时间 } }.start(, 0, 0); }
然后将每一秒的执行请求,发送给handler,这handler主要是处理界面的显示效果
//处理界面控件 Handler handler = new Handler() { @Override public void handleMessage(Message msg) { second--; if (second == 0) { timer.cancel(, 0, 0);//如果倒计时完成,取消定时事件 btnCode.setEnabled(true, 0, 0); second = 60; btnCode.setText("重新获取", 0, 0); }else{ btnCode.setText("重新获取(" + second + ")", 0, 0); } } };
这就完成了我们的获取手机短信验证码功能.这里附上全部代码,及效果图
package wutongwei.com.studyvalicode; import android.app.Activity; import android.os.Handler; import android.os.Message; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import java.util.Timer; import java.util.TimerTask; public class MainActivity extends Activity implements View.OnClickListener { Button btnCode; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState, 0, 0); setContentView(R.layout.activity_main, 0, 0); btnCode = (Button) findViewById(R.id.btn_code, 0, 0); btnCode.setOnClickListener(this, 0, 0); } @Override public void onClick(View v) { fetchCode(, 0, 0); } //定时器 Timer timer; int second = 60; //处理界面控件 Handler handler = new Handler() { @Override public void handleMessage(Message msg) { second--; if (second == 0) { timer.cancel(, 0, 0);//如果倒计时完成,取消定时事件 btnCode.setEnabled(true, 0, 0); second = 60; btnCode.setText("重新获取", 0, 0); }else{ btnCode.setText("重新获取(" + second + ")", 0, 0); } } }; //逻辑处理 void fetchCode() { //获取到网络请求回应后,开始禁止用户60秒时间重新获取验证码 btnCode.setEnabled(false, 0, 0); new Thread() { @Override public void run() { /// /// 这里是获取网络数据请求 /// 根据自己的需求进行处理 /// 通过HTTPURLConnection或者HttpClient来发送获取手机验证码的请求 /// //获取网络数据后,开始执行倒计时事件 timer = new Timer(, 0, 0); timer.schedule(new TimerTask() { @Override public void run() { handler.sendEmptyMessage(0, 0, 0); } }, 0, 1000, 0, 0);//任务事件,延迟执行时间,定时执行时间 } }.start(, 0, 0); } }