安卓APP源码和设计报告——基于Android的垃圾分类系统

news2024/11/14 20:42:07

《移动应用开发》大作业报告

题 目基于Android的垃圾分类系统
系 部
班 级
学 生 姓 名
学 号
指 导 教 师
时 间

1、项目名称

垃圾分类系统

2、项目概述

近些年,由于人民生活水平是的提高,生活方式与生活节奏的加快,使我国的垃圾生产数量已远超我国环境所能承受的能力,这也得到了国家领导人的注意,所以我国提出了垃圾分类的举措。垃圾分类措施陆续在各地展开,我国将垃圾分为四类:可回收垃圾、有害垃圾、湿垃圾和干垃圾。

随着越来越多的城市实施垃圾分类的政策,为了提供更加方便快捷的学习垃圾分类知识,软件的方式无疑是现代社会最有效可行的方式,所以开发了基于Android的垃圾分类系统。

本系统主要将垃圾分类与Android平台的App相结合,开发出一个对用户有所帮助的了解垃圾分类的系统,运用手机App 的易于流行的特点,来让人们了解垃圾分类的知识。因为垃圾无处不在并且每个人每天都在产生垃圾,所以该App能够满足日常生活中绝大部分用户的需求。

本系统最终开发了一个功能基本完善的垃圾分类系统,集用户的登录和注册管理、垃圾分类答题管理、搜索垃圾信息管理、垃圾分类百科学习管理为一体的垃圾分类系统。

该系统主要实现的功能模块包括:

用户中心模块:实现用户登录和注册的功能。

答题模块:用户通过答题的形式来辨别和加深对垃圾类别的认识。

查询垃圾信息模块:通过文字搜索的方式查询对应类别垃圾的信息。

垃圾百科模块:通过页面学习四类垃圾的分类情况。

设置模块:显示登录用户名,用户协议和强制下线等功能。

3、目的与要求

通过一个综合的实例,进一步掌握移动应用程序开发的基本原理和方法,提高基于Android Studio对图形用户界面的设计和开发能力,以及对控件事件处理、数据存储以及网络访问的能力。具体包括如下几个方面:

1)熟练掌握Android开发工具Android Studio的使用。

2)熟练掌握Android线性布局的使用方法,并熟练使用Activity、Fragment、ListView、TextView、Button、EditText、ImageView等视图组件构建具有良好用户体验的App界面。

3)熟练掌握对控件常用事件进行处理的方法。

4)掌握数据存储或网络访问的基本方法。

4、系统实现环境

集成开发环境:Android Studio 3.0及以上

JDK :1.8及以上

Android版本:9.0及以上

Android API:28及以上

5、系统设计与实现

1)用户的账号和密码保持在安卓本地数据库:使用 Android自带的关系型数据库SQLite。创建MydatabaseHelper继承SQLiteOpenHelper。

static String name="user.db";

static int dbVersion=1;

public MydatabaseHelper(Context context){

super(context, name,null, dbVersion);

}

public void onCreate(SQLiteDatabase db) {

String sql="create table user(id integer primary key autoincrement,username varchar(20),password varchar(20))";

db.execSQL(sql);

}

2)登录功能:在LoginActivity通过.getText().toString()得到用户输入信息,在UserService里通过帮助类dbHelper获得数据库对象,通过UserService 类里面String sql="select * from user where username=? and password=?"根据用户信息查询数据库信息,若用户输入信息匹配数据库信息则登录成功,反之则登录失败。

login = findViewById(R.id.login);

login.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

String account = et_account.getText().toString(); //得到用户输入信息

String password = et_password.getText().toString();

System.out.println(account);

System.out.println(password);

Log.i("TAG",account+"_"+password);

UserService uService=new UserService(LoginActivity.this);

boolean flag=uService.login(account, password);

if (flag) {

editor= pref.edit();

if(rememberPass.isChecked()){

editor.putBoolean("remember_password", true);

editor.putString("account",account);

editor.putString("password",password);

}else{

editor.clear();

}

editor.apply();

Log.i("TAG","登录成功");

Toast.makeText(LoginActivity.this, "登陆成功", Toast.LENGTH_SHORT).show();

Intent intent = new Intent(LoginActivity.this, MainActivity.class);

intent.putExtra("str",account);

startActivity(intent);

finish();

}

else {

Log.i("TAG","登录失败");

Toast.makeText(LoginActivity.this, "密码或者用户名输入错误!", Toast.LENGTH_SHORT).show();

}

}

});

3)注册功能:通过UserService 类里面String sql="insert into user(username,password) values(?,?)"实现判断注册是否成功。

register.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String name=username.getText().toString().trim();
String pass=password.getText().toString().trim();
Log.i("TAG",name+"_"+pass);
UserService uService=new UserService(RegisterActivity.this);
User user=new User();
user.setUsername(name);
user.setPassword(pass);
uService.register(user);
Toast.makeText(RegisterActivity.this, "注册成功", Toast.LENGTH_LONG).show();
Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
});

UserService类:

public boolean login(String username,String password){

SQLiteDatabase sdb=dbHelper.getReadableDatabase();

String sql="select * from user where username=? and password=?";

Cursor cursor=sdb.rawQuery(sql, new String[]{username,password});

if(cursor.moveToFirst()==true){

cursor.close();

return true;

}

return false;

}

public boolean register(User user){

SQLiteDatabase sdb=dbHelper.getReadableDatabase();

String sql="insert into user(username,password) values(?,?)";

Object obj[]={user.getUsername(),user.getPassword()};

sdb.execSQL(sql, obj);

return true;

}

4)搜索功能:使用OkHttp和Gson进行简单网络请求与解析。在HttpUtil类里面创建sendOkHttpRequest()网络请求方法,在进行OKHttp封装:在SearchActivity里通过String garbageUrl写搜索接口地址,调用HttpUtil类中的sendOkHttpRequest()方法进行搜索功能,在使用GSON将网络返回的json字符串转为对象。

HttpUtil类 :

public class HttpUtil {

public static void sendOkHttpRequest(String address,okhttp3.Callback callback){

OkHttpClient client=new OkHttpClient();

Request request=new Request.Builder().url(address).build();

client.newCall(request).enqueue(callback);

}

}

SearchActivity :OKHttp封装

public void requestGarbage(final String garbageID){

String garbageUrl=

"https://api.tianapi.com/lajifenlei/index?key=882f80503756018b20d77c21d92057bc&word="+garbageID;

HttpUtil.sendOkHttpRequest(garbageUrl, new Callback() {

public void onResponse(Call call, Response response) throws IOException {

final String responseText = response.body().string();

final GarbageSearch garbageSearch= Utility.handleGarbageSearchResponse(responseText);

Log.d(getClass().getSimpleName(), "========="+garbageSearch.msg);

runOnUiThread(new Runnable() {

public void run() {

Log.d(getClass().getSimpleName(), "========="+garbageSearch.msg);

if(garbageSearch!=null&&"success".equals(garbageSearch.msg) ) {

SharedPreferences.Editor editor=

PreferenceManager.getDefaultSharedPreferences(SearchActivity.this).edit();

editor.putString("garbageSearch",responseText);

editor.apply();

showGarbageInfo(garbageSearch);

}else {

Toast.makeText(SearchActivity.this,"获取垃圾信息失败",Toast.LENGTH_SHORT).show();

}

}

});

}

Utility :Gson解析json数据

public class Utility {

public static GarbageSearch handleGarbageSearchResponse(String response){

try{

return new Gson().fromJson(response, GarbageSearch.class);

}catch(Exception e){

e.printStackTrace();

return null;

}

}

}

5)百科学习功能:通过TabLayout与ViewPager的联合使用实现顶部导航和页面对应一起切换。这样通过FragmentPagerAdapter适配器把百科的四个垃圾Fragment与ViewPager连在一起。

public class PagerAdapter extends FragmentPagerAdapter {//定义适配器

List<Fragment> fragments;

public PagerAdapter(FragmentManager fm, List<Fragment> fragments) {

super(fm);

this.fragments=fragments;

}

public int getCount() {

return fragments.size();//有几个页面

}

public Fragment getItem(int position) {

return fragments.get(position);//显示第几个页面

}

6)答题功能:使用bean类序列化存储题目实现答题功能。

private TextView btn_sub1;

private List<RefuseBean> mList;

private TextView select1;

private ImageView back;

private RadioGroup select1_1; // 题目

private int num = 0; // 分数

private boolean isXaun = false;

select1 = findViewById(R.id.tv_timu);

select1_1 = findViewById(R.id.select1_1);

mList = new ArrayList<>();

// A 可回收物 B 干垃圾 C 有害垃圾 D 湿垃圾

RefuseBean refuseBean1 = new RefuseBean();

refuseBean1.setName("剩菜属于什么垃圾?");

refuseBean1.setType("D 湿垃圾");

mList.add(refuseBean1);

num = (int) Math.floor(Math.random() * 10 + 1);

select1.setText(mList.get(num - 1).getName());

btn_sub1 = findViewById(R.id.btn_sub1);

select1_1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {

public void onCheckedChanged(RadioGroup group, int checkedId) { //单选框 RadioGroup

isXaun = true; }

});

public void onClick(View v) {

TextView answer = (TextView) findViewById(R.id.answer);

if (!isXaun) {

Toast.makeText(ExamActivity.this, "请选择答案", Toast.LENGTH_SHORT).show();

return;

}

String select11 = select1.getText().toString();

if (select11.equals(mList.get(num - 1).getName())) {

for (int i = 0; i < select1_1.getChildCount(); i++) {

RadioButton select1_1_1 = (RadioButton) select1_1.getChildAt(i);

String select1_1_11 = select1_1_1.getText().toString();

if (select1_1_1.isChecked()) {

if (select1_1_11.equals(mList.get(num - 1).getType())) {

switch (i) {

case 0:

answer.setText("您当前答案是 A ,答对了,真棒!");

break;

case 1:

answer.setText("您当前答案是 B ,答对了,真棒!");

break;

case 2:

answer.setText("您当前答案是 C ,答对了,真棒!");

break;

case 3:

answer.setText("您当前答案是 D ,答对了,真棒!");

break;

}

} else {

answer.setText("答错了,正确答案是 " + mList.get(num - 1).getType());

}

break;

}

}

}

7)强制下线功能:在应用重新开始时注册广播接收器。因为创建了BaseActivity类作为所有活动的父类,所以只需要在BaseActivity中动态注册一个广播接收器。在BaseActivity类的onResume()中new ForceOfflineReceiver()实现在应用重新开始时注册广播接收器,在SettingsActivity里面的onClick()里添加sendBroadcast(intent)实现创建点击提示强制下线。

主要代码:

class ForceOfflineReceiver extends BroadcastReceiver{ // 创建一个广播接收器

public void onReceive(final Context context, Intent intent) { // 写一个强制下线的警告框

AlertDialog.Builder builder = new AlertDialog.Builder(context);

builder.setTitle("警告");

builder.setMessage("你正在强制下线");

builder.setCancelable(false);

builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialogInterface, int i) {

ActivityCollector.finishAll();// 销毁所有活动

Intent intent = new Intent(context, LoginActivity.class); // 重新启动LoginActivity

context.startActivity(intent);

}

});

builder.show();

}

}

6、系统运行结果

1)登录注册页面:

图1 登录 图2 注册

2)首页:答题页面和搜索页面

图3 首页 图2 答题页面

图4 搜索页面

3)百科页面:

图5 百科页面

4)设置页面:

图6 设置页面 图7 用户协议

图8 当前版本 图9 强制下线

7、实验总结

通过本学期Android studio的学习,知道了Android是一个平台,它包括:基础系统、开发工具和完整的文档;,它采用Linux为其支撑操作系统,以Java作为其开发环境,实现了完整的电话、视频、网络、界面设计等基础功能。了解了一个界面就是一个Activity,View是组件,Intent:是Android应用程序界面之间及功能部件之间实现信息交互的桥梁,Service运行于后台的程序,Android应用程序的配置文件AndroidManifest.xml。

通过一个垃圾分类的实例,进一步掌握移动应用程序开发的基本原理和方法,提高基于Android Studio对图形用户界面的设计和开发能力,以及对控件事件处理、数据存储以及网络访问的能力。但是在完成垃圾分类APP的设计过程中也出现了很多错误。

比如配置错误:使用OkHttp进行网络请求和使用Gson进行数据解析时报错,解决方法是在build.gradle中增加compile 'com.squareup.okhttp3:okhttp:3.2.0'和compile 'com.google.code.gson:gson:2.7'。在xml文件中写页面时也有很多错误,比如图片铺不满ImageView,加上属性android:scaleType="fitXY"得到解决;页面各个控件排布混乱,通过RelativeLayout和LinearLayout布局,orientation和layout_weight等属性写出基本满意页面布局。Java类中把ViewPager和Fragment结合起来时,刚开始适配器是PagerAdapter,后来换用FragmentPagerAdapter,当你实现一个FragmentPagerAdapter,你必须至少覆盖getCount()和getItem()方法。使用网络请求时报权限错误,在AndroidManifest.xml里面加入允许网络android.permission.INTERNET得到解决。

本系统也还有很多有待改进的地方,比如页面UI不够美观,页面功能不够完善等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/67337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink系列之Flink之Time和WaterMark深入剖析

title: Flink系列 一、Flink Window 常见需求背景 1.0 理论描述 需求描述&#xff1a; 每隔 5 秒&#xff0c;计算最近 10 秒单词出现的次数。 滑动窗口 每隔 5 秒&#xff0c;计算最近 5 秒单词出现的次数。 滚动窗口 第一个&#xff1a; 关于 TimeCharacteristic Process…

[附源码]Python计算机毕业设计Django医疗纠纷处理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

[附源码]Python计算机毕业设计Django校园一卡通服务平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

HarmonyOS/OpenHarmony应用开发-FA卡片开发体验

卡片概述 卡片是一种界面展示形式&#xff0c;可以将应用的重要信息或操作前置到卡片&#xff0c;以达到服务直达&#xff0c;减少体验层级的目的。 卡片常用于嵌入到其他应用&#xff08;当前只支持系统应用&#xff09;中作为其界面的一部分显示&#xff0c;并支持拉起页面…

[附源码]Python计算机毕业设计Django校园疫情管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

优品汇系统开发机制介绍

优品汇系统通过通过消费增值模式&#xff0c;促进商品流通&#xff0c;打造中g最大的供应链。作为对政策的回应&#xff0c;绿点刺激实体经济。前期通过科学合理的业务体系&#xff0c;将大部分利润分配给客户和朋友&#xff0c;从而快速创造人气和粉丝数据。中期将逐步完善产品…

计算机网络学习笔记(Ⅲ):数据链路层

目录 1 数据链路层概述 1.1 基本概念 1.2 主要功能 2 封装成帧和透明传输 2.1 封装成帧 2.2 透明传输 1.字符计数法 2.字符填充法 3.零比特填充法 4.违规编码法 3 差错控制 3.1 差错 3.1 检错编码 1.奇偶校验码 2.CRC循环冗余码 3.2 纠错编码 1.确定校验码位数…

基于逆滤波算法的无约束图像超分辨重构研究-附Matlab代码

⭕⭕ 目 录 ⭕⭕✳️ 一、引言✳️ 二、逆滤波复原理论✳️ 三、实验验证✳️ 四、Matlab程序获取与验证✳️ 一、引言 图像复原( Image Restoration)&#xff0c;也称图像恢复&#xff0c;是图像处理的一个重要方面。其目的就是尽可能地减少或去除在获取数字图像过程中发生的…

redis高级

redis持久化的两种方式&#xff1a;&#xff08;重点&#xff09; RDB: 全量打包-----------将内存中的所有数据存储在磁盘 执行一个bgsave ----1. 关机redis 2. 缺点&#xff1a;1.大量的数据重复打包和覆盖耗费时间和性能 2.配置save 不能把所有情况考虑在内&#xff0c;red…

微信公众号小程序怎么做?【公众号小程序搭建】

现在我们使用小程序的频率非常高&#xff0c;而且小程序也给我们带来很多便捷的体验&#xff0c;不少企业公司商家都有自己的微信公众号小程序。那么微信公众号小程序怎么做呢&#xff0c;下面跟大家简单说说。 1、注册小程序账号 做微信公众号小程序之前要有小程序账号&…

快速上手Django(七) -Django之登录cookie和session

文章目录快速上手Django(七) -Django之登录cookie和session一、cookie、session基础cookiesession二、Django SessionDjango启用SessionDjango Session存储方式三、Django中自定义用户模型需求背景自定义用户模型整体实现思路自定义User模型示例代码【非必须】自定义一个管理器…

Kafka 设计原理

文章目录1、Kafka 使用场景2、Kafka 架构2.1、工作流程2.2、副本机制2.3、生产者2.3.1、生产方式2.3.2、分区策略Round-robinRandomnessKey-ordering2.4、消费者2.4.1、消息队列模型2.4.2、消费方式2.4.3、分区策略RangeRoundRobin2.5、消息可靠性1、Kafka 使用场景 Kafka 是采…

图书馆座位预约管理系统毕业设计,图书馆座位管理系统设计与实现,图书馆座位预约系统毕业论文毕设作品参考

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于web网页的教室图书馆座位预约系统&#xff0c;整个网站项目使用了B/S架构&#xff0c;基于python的Django框架下开发&#xff1b;管理员通过后台录入信息、管理信息&#xff0c;设置网站信息&#xff0c…

CUDA入门和网络加速学习(一)

0. 简介 最近作者希望系统性的去学习一下CUDA加速的相关知识&#xff0c;正好看到深蓝学院有这一门课程。所以这里作者以此课程来作为主线来进行记录分享&#xff0c;方便能给CUDA网络加速学习的萌新们去提供一定的帮助。 1. GPU与CPU区别 处理器指标一般主要分为两大类&…

异构体之间通信

一、WIFI通信 1、网络配置 IP地址 网络地址 主机地址 假设IP地址是192.168.100.1&#xff0c;这个地址中包含了很多含义。如下所示&#xff1a; 网络地址(相当于街道地址)&#xff1a;192.168.100.0 主机地址(相当于各户的门号)&#xff1a;0.0.0.1 IP地址(相当于住户地址…

【Java进阶篇】第七章 多线程

文章目录一、多线程概述1、进程与线程2、进程与线程的关系二、多线程并发的实现1、线程的实现方式一2、线程的实现方式二三、线程的生命周期1、线程的五个生命周期2、常用方法3、线程的sleep4、终止线程的睡眠状态5、强行终止线程的执行6、合理终止一个线程的执行四、线程的调度…

apache html调用bash脚本案例

首先安装apache服务,采用yum的方式即可&#xff0c;因为用到的都是apache的基本功能&#xff0c;不需要编译安装 yum -y install httpd 然后准备html页面&#xff0c;这个页面其实就是调用bash脚本的页面&#xff0c;提供页面操作然后调用服务器上的脚步文件 网页布局建议用…

【嵌入式UI框架:LVGL】使用恩智浦GUI设计工具,像Qt一样开发MCU界面

LVGL是一个免费的开源嵌入式图形库&#xff0c;它提供创建嵌入式GUI所需的功能&#xff0c;具有易于使用的图形元素、精美的视觉效果和低内存占用。完整的图形框架包括供您在创建GUI时所用的各种小部件&#xff0c;并支持更高级的功能&#xff0c;例如动画和抗锯齿。 一、工具&…

springcloud入门

微服务架构介绍 微服务架构&#xff0c; 简单的说就是将单体应用进一步拆分&#xff0c;拆分成更小的服务&#xff0c;每个服务都是一个可以独 立运行的项目。 微服务架构的常见问题 一旦采用微服务系统架构&#xff0c;就势必会遇到这样几个问题&#xff1a; 这么多小服务…

MYSQL——毫秒值和日期类型数据的转换,DATE_SUB的用法

MYSQL——毫秒值和日期类型数据的转换&#xff0c;DATE_SUB的用法一、毫秒值转换成日期数据类型二、日期数据类型转换成毫秒值三、DATE_SUB的用法一、毫秒值转换成日期数据类型 语法&#xff1a;FROM_UNIXTIME(毫秒值字段,‘%Y-%m-%d %h:%i:%s’) 举例&#xff1a; select id…