Koltin26,kotlin数组与列表区别

这篇博客介绍了在Kotlin中处理Android应用中的短信验证码功能,包括获取验证码、验证验证码以及倒计时逻辑的实现。在`LoginActivity.kt`中,使用了`SMSSDK`库进行短信操作,并通过`Handler`进行倒计时显示。此外,还展示了`SMSUtil`工具类用于手机号码的合法性检查。
摘要由CSDN通过智能技术生成

<ImageView

android:id="@+id/iv_address_manager"

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:scaleType=“fitXY”

android:src="@mipmap/user_center_orther" />

<LinearLayout

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:background="#3090E6"

android:orientation=“vertical”>

<RelativeLayout

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:layout_marginTop=“30dp”

android:gravity=“center_vertical”>

<TextView

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_centerVertical=“true”

android:layout_marginLeft=“15dp”

android:text=“我的”

android:textColor="#FFF"

android:textSize=“18sp” />

<ImageView

android:id="@+id/tv_user_setting"

android:layout_width=“30dp”

android:layout_height=“30dp”

android:layout_alignParentRight=“true”

android:layout_marginRight=“15dp”

android:src="@mipmap/user_center_setting" />

<ImageView

android:id="@+id/iv_user_notice"

android:layout_width=“30dp”

android:layout_height=“30dp”

android:layout_marginRight=“40dp”

android:layout_toLeftOf="@+id/tv_user_setting"

android:src="@mipmap/user_center_notice" />

LoginActivity.kt登录界面的操作,首先包括监听验证码的操作动作,发送验证码和验证验证码,其中增加了验证码的倒计时操作功能

package com.example.takeout.ui.activity

import android.annotation.SuppressLint

import android.os.Bundle

import android.os.Handler

import android.os.Message

import android.os.SystemClock

import android.text.TextUtils

import android.util.Log

import androidx.appcompat.app.AppCompatActivity

import cn.smssdk.EventHandler

import cn.smssdk.SMSSDK

import com.example.takeout.R

import com.heima.takeout.utils.SMSUtil

import com.mob.MobSDK

import kotlinx.android.synthetic.main.activity_login.*

class LoginActivity : AppCompatActivity() {

//监听每一次提交验证码操作

val eh = object : EventHandler() {

override fun afterEvent(event: Int, result: Int, data: Any) {

if (result == SMSSDK.RESULT_COMPLETE) {

//回调完成

if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {

//提交验证码成功

Log.d(“LoginActivity”, “提交验证码成功”)

} else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {

//获取验证码成功

Log.d(“LoginActivity”, “获取验证码成功”)

} else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) {

//返回支持发送验证码的国家列表

}

} else {

(data as Throwable).printStackTrace()

}

}

}

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_login)

initListener()

MobSDK.submitPolicyGrantResult(true, null);

//注册短信回调

SMSSDK.registerEventHandler(eh)

}

private fun initListener() {

iv_user_back.setOnClickListener { finish() }

//获取验证码

tv_user_code.setOnClickListener {

val phone = et_user_phone.text.toString().trim()

//验证手机号码

if (SMSUtil.judgePhoneNums(this, phone)) {

// 请求验证码,其中country表示国家代码,如“86”;phone表示手机号码,如“13800138000”

SMSSDK.getVerificationCode(“86”, phone)

//开启倒计时

tv_user_code.isEnabled = false

Thread(CutDownTask()).start()

}

}

iv_login.setOnClickListener {

//提交验证码

val phone = et_user_phone.text.toString().trim()

val code = et_user_code.text.toString().trim()

if (SMSUtil.judgePhoneNums(this, phone) && !TextUtils.isEmpty(code)) {

// 提交验证码,其中的code表示验证码,如“1357”

SMSSDK.submitVerificationCode(“86”, phone, code)

}

//登录外卖服务器

// loginActivityPresenter.loginByPhone(phone)

}

}

companion object {

val TIME_MINUS = -1 //剩余时间的消息

val TIME_IS_OUT = 0 //60s超时

}

//创建一个handler来刷新UI

val handler = @SuppressLint(“HandlerLeak”)

object : Handler(){

override fun handleMessage(msg: Message?) {

super.handleMessage(msg)

when(msg!!.what){

TIME_MINUS -> tv_user_code.text = “剩余时间(${time})秒”

TIME_IS_OUT -> {

tv_user_code.isEnabled = true

tv_user_code.text = “点击重发”

time = 60

}

}

}

}

//倒计时的实现60s

var time = 60

inner class CutDownTask: Runnable {

override fun run() {

//倒计时循环

while (time>0){

//刷新剩余时间,当前子线程,使用handler

handler.sendEmptyMessage(TIME_MINUS)

SystemClock.sleep(999)

time –

}

handler.sendEmptyMessage(TIME_IS_OUT)

}

}

// 使用完EventHandler需注销,否则可能出现内存泄漏

override fun onDestroy() {

super.onDestroy()

SMSSDK.unregisterEventHandler(eh)

}

}

SMSUtil.kt验证码的合理性校验

package com.heima.takeout.utils

import android.Manifest

import android.app.Activity

import android.content.pm.PackageManager

import android.os.Build

import android.text.TextUtils

import android.widget.Toast

import java.util.*

object SMSUtil {

/**

  • 判断手机号码是否合理

  • y

*/

fun judgePhoneNums(activity: Activity, phoneNums: String): Boolean {

if (isMatchLength(phoneNums, 11) && isMobileNO(phoneNums)) {

return true

}

Toast.makeText(activity, “手机号码输入有误!”, Toast.LENGTH_SHORT).show()

return false

}

/**

  • 验证手机格式

*/

fun isMobileNO(mobileNums: String): Boolean {

/*

  • 移动:134、135、136、137、138、139、150、151、157(TD)、158、159、187、188

  • 联通:130、131、132、152、155、156、185、186 电信:133、153、180、189、(1349卫通)

  • 总结起来就是第一位必定为1,第二位必定为3或5或8,其他位置的可以为0-9

*/

val telRegex = “[1][358]\d{9}”// "[1]“代表第1位为数字1,”[358]“代表第二位可以为3、5、8中的一个,”\d{9}"代表后面是可以是0~9的数字,有9位。

if (TextUtils.isEmpty(mobileNums))

return false

else

return mobileNums.matches(telRegex.toRegex())

}

/**

  • 判断一个字符串的位数

  • @param str

  • @param length

  • @return

*/

fun isMatchLength(str: String, length: Int): Boolean {

if (str.isEmpty()) {

return false

} else {

return if (str.length == length) true else false

}

}

/**

  • 权限校验

  • @param activity

*/

fun checkPermission(activity: Activity) {

if (Build.VERSION.SDK_INT >= 23) {

val readPhone = activity.checkSelfPermission(Manifest.permission.READ_PHONE_STATE)

val receiveSms = activity.checkSelfPermission(Manifest.permission.RECEIVE_SMS)

val readSms = activity.checkSelfPermission(Manifest.permission.READ_SMS)

val readContacts = activity.checkSelfPermission(Manifest.permission.READ_CONTACTS)

val readSdcard = activity.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)

题外话

不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊~

这里我为大家准备了一些我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,点击这里免费分享给大家,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~

最后如果马化腾把腾讯给你一天,你会来做什么?欢迎评论区讨论。

L_STORAGE)

题外话

不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊~

这里我为大家准备了一些我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,点击这里免费分享给大家,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~

[外链图片转存中…(img-sgroFFTF-1646479217043)]

最后如果马化腾把腾讯给你一天,你会来做什么?欢迎评论区讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值