最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

安卓APP源碼和設計報告——基于Android的垃圾分類系統(tǒng)

2022-12-06 23:55 作者:考研保研直通車  | 我要投稿

《移動應用開發(fā)》大作業(yè)報告


題 目 基于Android的垃圾分類系統(tǒng)

系 部

班 級

學 生 姓 名

學 號

指 導 教 師

時 間

1、項目名稱


垃圾分類系統(tǒng)


2、項目概述


近些年,由于人民生活水平是的提高,生活方式與生活節(jié)奏的加快,使我國的垃圾生產(chǎn)數(shù)量已遠超我國環(huán)境所能承受的能力,這也得到了國家領導人的注意,所以我國提出了垃圾分類的舉措。垃圾分類措施陸續(xù)在各地展開,我國將垃圾分為四類:可回收垃圾、有害垃圾、濕垃圾和干垃圾。


隨著越來越多的城市實施垃圾分類的政策,為了提供更加方便快捷的學習垃圾分類知識,軟件的方式無疑是現(xiàn)代社會最有效可行的方式,所以開發(fā)了基于Android的垃圾分類系統(tǒng)。


本系統(tǒng)主要將垃圾分類與Android平臺的App相結(jié)合,開發(fā)出一個對用戶有所幫助的了解垃圾分類的系統(tǒng),運用手機App 的易于流行的特點,來讓人們了解垃圾分類的知識。因為垃圾無處不在并且每個人每天都在產(chǎn)生垃圾,所以該App能夠滿足日常生活中絕大部分用戶的需求。


本系統(tǒng)最終開發(fā)了一個功能基本完善的垃圾分類系統(tǒng),集用戶的登錄和注冊管理、垃圾分類答題管理、搜索垃圾信息管理、垃圾分類百科學習管理為一體的垃圾分類系統(tǒng)。


該系統(tǒng)主要實現(xiàn)的功能模塊包括:


用戶中心模塊:實現(xiàn)用戶登錄和注冊的功能。


答題模塊:用戶通過答題的形式來辨別和加深對垃圾類別的認識。


查詢垃圾信息模塊:通過文字搜索的方式查詢對應類別垃圾的信息。


垃圾百科模塊:通過頁面學習四類垃圾的分類情況。


設置模塊:顯示登錄用戶名,用戶協(xié)議和強制下線等功能。


3、目的與要求


通過一個綜合的實例,進一步掌握移動應用程序開發(fā)的基本原理和方法,提高基于Android Studio對圖形用戶界面的設計和開發(fā)能力,以及對控件事件處理、數(shù)據(jù)存儲以及網(wǎng)絡訪問的能力。具體包括如下幾個方面:


1)熟練掌握Android開發(fā)工具Android Studio的使用。


2)熟練掌握Android線性布局的使用方法,并熟練使用Activity、Fragment、ListView、TextView、Button、EditText、ImageView等視圖組件構(gòu)建具有良好用戶體驗的App界面。


3)熟練掌握對控件常用事件進行處理的方法。


4)掌握數(shù)據(jù)存儲或網(wǎng)絡訪問的基本方法。


4、系統(tǒng)實現(xiàn)環(huán)境


集成開發(fā)環(huán)境:Android Studio 3.0及以上


JDK :1.8及以上


Android版本:9.0及以上


Android API:28及以上


5、系統(tǒng)設計與實現(xiàn)


1)用戶的賬號和密碼保持在安卓本地數(shù)據(jù)庫:使用 Android自帶的關系型數(shù)據(jù)庫SQLite。創(chuàng)建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獲得數(shù)據(jù)庫對象,通過UserService 類里面String sql="select * from user where username=? and password=?"根據(jù)用戶信息查詢數(shù)據(jù)庫信息,若用戶輸入信息匹配數(shù)據(jù)庫信息則登錄成功,反之則登錄失敗。


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(?,?)"實現(xiàn)判斷注冊是否成功。


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進行簡單網(wǎng)絡請求與解析。在HttpUtil類里面創(chuàng)建sendOkHttpRequest()網(wǎng)絡請求方法,在進行OKHttp封裝:在SearchActivity里通過String garbageUrl寫搜索接口地址,調(diào)用HttpUtil類中的sendOkHttpRequest()方法進行搜索功能,在使用GSON將網(wǎng)絡返回的json字符串轉(zhuǎn)為對象。


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數(shù)據(jù)


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的聯(lián)合使用實現(xiàn)頂部導航和頁面對應一起切換。這樣通過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類序列化存儲題目實現(xiàn)答題功能。


private TextView btn_sub1;


private List<RefuseBean> mList;


private TextView select1;


private ImageView back;


private RadioGroup select1_1; // 題目


private int num = 0; // 分數(shù)


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)強制下線功能:在應用重新開始時注冊廣播接收器。因為創(chuàng)建了BaseActivity類作為所有活動的父類,所以只需要在BaseActivity中動態(tài)注冊一個廣播接收器。在BaseActivity類的onResume()中new ForceOfflineReceiver()實現(xiàn)在應用重新開始時注冊廣播接收器,在SettingsActivity里面的onClick()里添加sendBroadcast(intent)實現(xiàn)創(chuàng)建點擊提示強制下線。


主要代碼:


class ForceOfflineReceiver extends BroadcastReceiver{ // 創(chuàng)建一個廣播接收器


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、系統(tǒng)運行結(jié)果


1)登錄注冊頁面:






圖1 登錄 圖2 注冊


2)首頁:答題頁面和搜索頁面






圖3 首頁 圖2 答題頁面






圖4 搜索頁面


3)百科頁面:










圖5 百科頁面


4)設置頁面:






圖6 設置頁面 圖7 用戶協(xié)議






圖8 當前版本 圖9 強制下線


7、實驗總結(jié)


通過本學期Android studio的學習,知道了Android是一個平臺,它包括:基礎系統(tǒng)、開發(fā)工具和完整的文檔;,它采用Linux為其支撐操作系統(tǒng),以Java作為其開發(fā)環(huán)境,實現(xiàn)了完整的電話、視頻、網(wǎng)絡、界面設計等基礎功能。了解了一個界面就是一個Activity,View是組件,Intent:是Android應用程序界面之間及功能部件之間實現(xiàn)信息交互的橋梁,Service運行于后臺的程序,Android應用程序的配置文件AndroidManifest.xml。


通過一個垃圾分類的實例,進一步掌握移動應用程序開發(fā)的基本原理和方法,提高基于Android Studio對圖形用戶界面的設計和開發(fā)能力,以及對控件事件處理、數(shù)據(jù)存儲以及網(wǎng)絡訪問的能力。但是在完成垃圾分類APP的設計過程中也出現(xiàn)了很多錯誤。


比如配置錯誤:使用OkHttp進行網(wǎng)絡請求和使用Gson進行數(shù)據(jù)解析時報錯,解決方法是在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結(jié)合起來時,剛開始適配器是PagerAdapter,后來換用FragmentPagerAdapter,當你實現(xiàn)一個FragmentPagerAdapter,你必須至少覆蓋getCount()和getItem()方法。使用網(wǎng)絡請求時報權限錯誤,在AndroidManifest.xml里面加入允許網(wǎng)絡android.permission.INTERNET得到解決。


本系統(tǒng)也還有很多有待改進的地方,比如頁面UI不夠美觀,頁面功能不夠完善等。




安卓APP源碼和設計報告——基于Android的垃圾分類系統(tǒng)的評論 (共 條)

分享到微博請遵守國家法律
张北县| 万年县| 历史| 怀柔区| 侯马市| 鹤峰县| 玛纳斯县| 安西县| 措美县| 琼海市| 泰来县| 日喀则市| 独山县| 龙门县| 宿州市| 柳州市| 嘉黎县| 乐陵市| 崇仁县| 新安县| 上思县| 武义县| 新巴尔虎右旗| 青铜峡市| 周口市| 绿春县| 出国| 富蕴县| 溧阳市| 英超| 尤溪县| 肥东县| 静安区| 叶城县| 类乌齐县| 龙川县| 泰州市| 和田县| 江永县| 宝应县| 丰台区|