irpas技术客

kotlin简易微信实现_Hslven_kotlin 微信

大大的周 2912

代码文件:http://120.76.200.79/wp-content/uploads/2022/06/Hslven.ziphttp://120.76.200.79/wp-content/uploads/2022/06/Hslven.zip

实验实现如下功能:

①五个Activity页面主体内容及跳转

加载页面:

活动代码: Class Loadingactivity : BaseActivity() Over fun...{ ?super.onCreate(savedInstanceState) ?setContentView(R.layout.activity_loading) val main = Intent(this,MainActivity::class.java) ? ?var timer= Timer() ? ?class MyTimerTask():TimerTask(){ ? ? ? ?override fun run() { ? ? ? ? ? ?startActivity(main) ? ? ? ? ? ?finish() ? ? ? } ? } // 4秒后跳转 ? ?timer.schedule(MyTimerTask(),4000) } }

登录页面:

1:退出程序

2:保留此次登录信息,重启或者重新返回登录页面后保留

3:跳转到朋友页面

4:跳转到注册页面

活动代码: class MainActivity : BaseActivity() { ? ?override fun onCreate(savedInstanceState: Bundle?) { ? ? ? ?super.onCreate(savedInstanceState) ? ? ? ?setContentView(R.layout.activity_main) ? ? ? ? ?// 1)定义函数 ? ? ? ?val login: Button = findViewById(R.id.login1) ? ? ? ?val reg: Button = findViewById(R.id.reg) ? ? ? ?val rem: CheckBox = findViewById(R.id.remember) ? ? ? ?val back: ImageView = findViewById(R.id.error_png) ? ? ? ? ?// 2)调用数据库--存入和取出 ? ? ? ?val prefs = getSharedPreferences("data", MODE_PRIVATE) ? ? ? ?val editor = prefs.edit() ? ? ? ? ?// 2.1)返回上一次勾选 ? ? ? ?rem.isChecked = prefs.getBoolean("isRem", false) ?// 返回isRem的数据,如果没有数据,则默认false ? ? ? ? ?// 3)获取数据库中已存在的用户名和密码 ? ? ? ?val exist_user = prefs.getString("user", "") ? ? ? ?val exist_pass = prefs.getString("pass", "") ? ? ? ?// 3.1)定义文本框的函数,同样是局部变量修改后转的 全局变量 ? ? ? ?val userEdit: TextView = findViewById(R.id.user) ? ? ? ?val passEdit: TextView = findViewById(R.id.pass) ? ? ? ? ?// 5)不会使用类,开机后如果有存有数据则自动写入,和下方的代码是一样的 ? ? ? ?if (rem.isChecked) { ? ? ? ? ? ?// 5.2)从刚才的数据库获取 ? ? ? ? ? ?val now_user = prefs.getString("now_user", "") ? ? ? ? ? ?val now_pass = prefs.getString("now_pass", "") ? ? ? ? ? ? ?// 5.4)把记住的数据写入文本框 ? ? ? ? ? ?userEdit.setText(now_user) ? ? ? ? ? ?passEdit.setText(now_pass) ? ? ? } ? ? ? ? ?// 6)从BaseActivity来的--在BaseAcivity传入了是否清空文本框密码 ? ? ? ?val pass_clean = prefs.getBoolean("cleanpass", false)// 如果没有数据则默认不是 ? ? ? ? ?// 6.1)清空密码文本框 ? ? ? ?if (pass_clean) { ? ? ? ? ? ?passEdit.setText("") ? ? ? ? ? ? ?// 6.2)取消勾选‘记住我’,并且传入数据库 ? ? ? ? ? ?rem.isChecked = false ? ? ? ? ? ?editor.putBoolean("isRem",rem.isChecked) ? ? ? ? ? ? ?// 6.3) 把是否清空密码改成false ? ? ? ? ? ?editor.putBoolean("cleanpass",false) ? ? ? ? ? ?// 6.4)提交数据 ? ? ? ? ? ?editor.apply() // 提交数据 ? ? ? } ? ? ? ? ?login.setOnClickListener() { ? ? ? ? ? ?// 3.2)获取输入的用户名和密码 ? ? ? ? ? ?val user = user.text.toString() ? ? ? ? ? ?val pass = pass.text.toString() ? ? ? ? ? ? ?//4)如果账户密码数据库已存在则登录成功 ? ? ? ? ? ?if (user == exist_user && pass == exist_pass) { ? ? ? ? ? ? ? ? ?// 5)如果点击了‘记住我’登录, ? ? ? ? ? ? ? ?if (rem.isChecked) { ? ? ? ? ? ? ? ? ? ?// 5.1)存入输入的文本 ? ? ? ? ? ? ? ? ? ?editor.putString("now_user", user) ? ? ? ? ? ? ? ? ? ?editor.putString("now_pass", pass) ? ? ? ? ? ? ? ? ? ?editor.apply() // 提交数据 ? ? ? ? ? ? ? ? ? ? ?// 5.2)从刚才的数据库获取 ? ? ? ? ? ? ? ? ? ?val now_user = prefs.getString("now_user", "") ? ? ? ? ? ? ? ? ? ?val now_pass = prefs.getString("now_pass", "") ? ? ? ? ? ? ? ? ? ? ?// 5.4)把记住的数据写入文本框 ? ? ? ? ? ? ? ? ? ?userEdit.setText(now_user) ? ? ? ? ? ? ? ? ? ?passEdit.setText(now_pass) ? ? ? ? ? ? ? ? ? ? ?// 5.5)判断是否勾选‘记住我’,并保存到数据库,方便下一次在此界面包留是否勾选 ? ? ? ? ? ? ? ? ? ?val isRem = rem.isChecked ? ? ? ? ? ? ? ? ? ?editor.putBoolean("isRem", isRem) ? ? ? ? ? ? ? ? ? ?editor.apply() // 提交数据 ? ? ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? ? ?// 5.6)如果没有勾选,清空文本框 ? ? ? ? ? ? ? ? ? ?userEdit.setText("") ? ? ? ? ? ? ? ? ? ?passEdit.setText("") ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ?Toast.makeText(this, "登陆成功", Toast.LENGTH_LONG).show() ? ? ? ? ? ? ? ?// 进行跳转 ? ? ? ? ? ? ? ?val it = Intent(this, MsgListActivity::class.java) ? ? ? ? ? ? ? ?startActivity(it) ? ? ? ? ? } else if (user != exist_user) { ? ? ? ? ? ? ? ?Toast.makeText(this, "登陆失败,用户名不存在", Toast.LENGTH_LONG).show() ? ? ? ? ? } else { ? ? ? ? ? ? ? ?Toast.makeText(this, "登陆失败,请检查密码是否正确", Toast.LENGTH_LONG).show() ? ? ? ? ? } ? ? ? } ? ? ? ? ?reg.setOnClickListener() { ? ? ? ? ? ?val it1 = Intent(this, register::class.java) ? ? ? ? ? ?startActivity(it1) ? ? ? } ? ? ? ? ?back.setOnClickListener() { ? ? ? ? ? ?ActivityCollector.finishAll() ? ? ? } ? } }

注册页面:

1:返回到上一个活动页面

2:输入信息,用于保留数据并上传

3:点击后上传数据

? 活动代码: class register : AppCompatActivity() { ? ?override fun onCreate(savedInstanceState: Bundle?) { ? ? ? ?super.onCreate(savedInstanceState) ? ? ? ?setContentView(R.layout.activity_register1) ? ? ? ? ?val back:ImageView = findViewById(R.id.error_png) ? ? ? ?register.setOnClickListener() { ? ? ? ? ? ?// 定义函数 ? ? ? ? ? ?val user = ruser.text.toString() ? ? ? ? ? ?val pass = rpassword.text.toString() ? ? ? ? ? ? ?// 判断男女 ? ? ? ? ? ?val sex_nan = sexButton1.isChecked() ? ? ? ? ? ?val sex_nav = sexButton2.isChecked() ? ? ? ? ? ?// 调用数据库--存入和取出 ? ? ? ? ? ?val prefs = getSharedPreferences("data", Context.MODE_PRIVATE) ? ? ? ? ? ?val editor = prefs.edit() //存入 ? ? ? ? ? ? ?// 如果已有相同用户名--注册失败 ? ? ? ? ? ?// 1) 获取已存用户名 ? ? ? ? ? ?val exist_user = prefs.getString("user", "") ? ? ? ? ? ? ?// 2) 进行判断 ? ? ? ? ? ?if (user == exist_user) { ? ? ? ? ? ? ? ?Toast.makeText(this, "用户名已存在,无法注册!", Toast.LENGTH_LONG).show() ? ? ? ? ? } else { ? ? ? ? ? ? ? ?// 3) 注册成功--把各种数据存入数据库 ? ? ? ? ? ? ? ?editor.putString("user", user) ? ? ? ? ? ? ? ?editor.putString("pass", pass) ? ? ? ? ? ? ? ?if (sex_nan) { ? ? ? ? ? ? ? ? ? ?editor.putString("sex", "man") ? ? ? ? ? ? ? } else if (sex_nav) { ? ? ? ? ? ? ? ? ? ?editor.putString("sex", "woman") ? ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? ? ?editor.putString("sex", "hermaphrodite") ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ?editor.apply() // 提交数据 ? ? ? ? ? ? ? ? ?// 3.1)注册成功--跳转 ? ? ? ? ? ? ? ?Toast.makeText(this, "注册成功", Toast.LENGTH_LONG).show() ? ? ? ? ? ? ? ?val it = Intent(this, MainActivity::class.java) ? ? ? ? ? ? ? ?startActivity(it) ? ? ? ? ? } ? ? ? } ? ? ? ? ?back.setOnClickListener(){ ? ? ? ? ? ?finish() ? ? ? } ? } }

朋友界面:

?

1:返回到登录页面

2:点击后进入聊天界面

3:实现强制下线功能

活动代码: // 朋友界面 class MsgListActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_friend1) val back:TextView = findViewById(R.id.error_dark_png) //把聊天的最后一句话放在页面 val now_text:TextView = findViewById(R.id.now_text) val prefs = getSharedPreferences("data", MODE_PRIVATE) now_text.setText(prefs.getString("now_neirong","没有找到内容...")) back.setOnClickListener(){ //退出当前活动 finish() } // 强制下线 val go_out:Button = findViewById(R.id.go_out) go_out.setOnClickListener(){ val intent = Intent("go") sendBroadcast(intent) } // 跳转到天气列表 val weather:Button = findViewById(R.id.weatherlook) weather.setOnClickListener() { Toast.makeText(this, "ok", Toast.LENGTH_SHORT).show() SendRquestOkhttp() } //和朋友聊天 val chat:TextView = findViewById(R.id.now_text) val chatone:TextView = findViewById(R.id.text0) val chattwo:ImageView = findViewById(R.id.img0) val it2 = Intent(this,ChatActivity::class.java) chat.setOnClickListener(){ startActivity(it2) finish() } chatone.setOnClickListener(){ startActivity(it2) finish() } chattwo.setOnClickListener(){ startActivity(it2) finish() } } private fun SendRquestOkhttp() // 开启线程发起网络请求 {thread { try { val client = OkHttpClient() val request = Request.Builder() .url("https://·/free/day?appid=95979945&appsecret=pg8gdx39&unescape=1&cityid=101280803") .build() // execute发送请求返回数据 val response = client.newCall(request).execute() val responseData = response.body?.string() if (responseData != null) { show(responseData) } } catch (e: Exception) { e.printStackTrace() } } } private fun show(res:String) { try { val jsondata= JSONObject(res) val cityname=jsondata.getString("city") val date=jsondata.getString("date") val wea=jsondata.getString("wea") val week=jsondata.getString("week") val nowtem=jsondata.getString("tem") val tem_day=jsondata.getString("tem_day") val tem_night=jsondata.getString("tem_night") val win=jsondata.getString("win") val res="$date 城市:$cityname $week,天气如下,天气情况:$wea \n 现在温度:$nowtem 白天最高温度:$tem_day 晚上最高温度:$tem_night 风向:$win " showResponse(res) }catch (e:Exception) {e.printStackTrace() } } private fun showResponse(response: String) { val weather_text: TextView = findViewById(R.id.weather_text) runOnUiThread { //这里进行UI操作,将结果显示到界面上 weather_text.text = response } } }

聊天界面:

1:返回聊天界面

2:发送的信息被放在这里,重新进入或者重启后会保留

3:用于发送内容,发送后清空文本框

活动代码: class ChatActivity : AppCompatActivity() { ? ?override fun onCreate(savedInstanceState: Bundle?) { ? ? ? ?super.onCreate(savedInstanceState) ? ? ? ?setContentView(R.layout.activity_chat) ? ? ? ? ?val send:Button = findViewById(R.id.send) ? ? ? ?val replay:TextView = findViewById(R.id.replay) ? ? ? ?val text:TextView = findViewById(R.id.input_text) ? ? ? ?val back_now:ImageView = findViewById(R.id.back_now) ? ? ? ? ?// 建立数据库 ? ? ? ?val prefs = getSharedPreferences("data", MODE_PRIVATE) ? ? ? ?val editor = prefs.edit() ? ? ? ? ?// 进入保留内容(只保留一次) ? ? ? ?replay.setText(prefs.getString("neirong","")+ "\n") ? ? ? ? ?// 然后清空 ? ? ? ?editor.putString("neirong","") ? ? ? ?editor.apply() ? ? ? ? ?send.setOnClickListener(){ ? ? ? ? ? ?// 存入最后一句话 ? ? ? ? ? ?val textEdit = text.text.toString() ? ? ? ? ? ?editor.putString("now_neirong",textEdit) ? ? ? ? ? ?editor.apply() ? ? ? ? ? ?// 给文本框写入输入的内容 ? ? ? ? ? ?replay.setText(prefs.getString("neirong","")+ textEdit + "\n") ? ? ? ? ? ?// 保留文本 ? ? ? ? ? ?editor.putString("neirong",replay.text.toString()) ? ? ? ? ? ?editor.apply() ? ? ? ? ? ?// 发送后清空 ? ? ? ? ? ?text.setText("") ? ? ? } ? ? ? ?// 退出活动 ? ? ? ?back_now.setOnClickListener(){ ? ? ? ? ? ?val it2 = Intent(this,MsgListActivity::class.java) ? ? ? ? ? ?startActivity(it2) ? ? ? ? ? ?finish() ? ? ? } ? } }

者进入此页面两次就会清空)

⑤聊天页返回至消息列表页携带回最后一条消息内容,并更新数据库和消息列表页RecyclerView或者listview

仍然是使用SharedPreferences数据库保留最后一条消息内容,来携带返回

我们尝试发送信息

会携带最后一次输出的信息放在朋友页面的文本框

⑥强制下线

在朋友界面“方框3”处,注册了一个按钮来实现强制下线功能,点击之后会弹出文本框并且无法关闭,点击之后跳转到加载页面。

?

点击“强制下线”

点击“好的”,我们会在加载后进入登陆页面

同时为了用户的安全,通过此方法重新进入后会取消勾选“记住我”,并把保存密码的清空,需要用户重新输入密码

⑦在某一页面添加一按钮,点击后进行天气的查询。

至此,基本功能实现

强制下线的实现方法:

1. 新建一个单例类ActivityCollector作为Activity的集合

/* 单例类ActivityCollector作为Activity的集合,对所有的Activity进行管理 */ ? object ActivityCollector { ? ?private val activities=ArrayList<Activity>() ? ? ?/* 用于向ArrayList中添加Activity */ ? ?fun addActivity(actity:Activity){ ? ? ? ?activities.add(actity) ? } ? ? ? ?/* 用于从ArrayList中移除Activity */ ? ?fun removeActivity(actity: Activity){ ? ? ? ?activities.remove(actity) ? } ? ? ? ?/* 用于将ArrayList中存储的Activity全部销毁 */ ? ?fun finishAll(){ ? ? ? ?for (activity in activities){ ? ? ? ? ? ?if (!activity.isFinishing){ ? ? ? ? ? ? ? ?activity.finish() ? ? ? ? ? } ? ? ? } ? ? ? ?activities.clear() ? } }

2. 新建Class取名BaseActivity,添加代码让其继承AppCompatActivity,并重写onCreat()方法,重写onDestroy()方法

open class BaseActivity : AppCompatActivity() { ? ? ?override fun onCreate(savedInstanceState: Bundle?) { ? ? ? ?super.onCreate(savedInstanceState) ? ? ? ?ActivityCollector.addActivity(this) ? } ? ? ?override fun onDestroy() { ? ? ? ?super.onDestroy() ? ? ? ?ActivityCollector.removeActivity(this) ? } }

3. 让所有Activity继承BaseActivity,由于BaseActivity继承自AppCompatActivity,所以所有Activity现有功能都不受影响

class MainActivity : BaseActivity()

4. 设置按钮的点击事件,只需调用ActivityCollector的finishAll方法

//退出程序 ? ? ? ?set_close.setOnClickListener { ? ? ? ? ? ?ActivityCollector.finishAll() ? ? ? }


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Kotlin #微信 #kotlin简易微信实现