智能终端软件开发自主学习报告-(3).doc_第1页
智能终端软件开发自主学习报告-(3).doc_第2页
智能终端软件开发自主学习报告-(3).doc_第3页
智能终端软件开发自主学习报告-(3).doc_第4页
智能终端软件开发自主学习报告-(3).doc_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目 录1 引言12 安卓的概述12.1 Android简介12.2 Android平台特性22.3 Android用户界面构建22.4 资源的获取和使用33 功能设计概述与需求分析43.1 软件功能设计43.2 数据库设计43.3 需求分析43.4 用户分析53.3.1用户要求具备基本功能53.3.2除基本功能外,可另曾特色功能53.5 系统体系结构64 功能模块介绍64.3 添加日记模块94.4 编辑日志104.5 添加设置闹钟13自学心得16参考文献171 引言随着Android的崛起,智能手机的操作系统绝大数都是Android系统。Android的成功,并不是什么巧合,Android所获得的成就,有2个重要方面:1.Android是一款开放源码的操作系统;因此,人人都有可能成为Android的开发人员,这样使得Android的应用丰富多彩。2.Android注重用户体验;用户体验的提高,使得操作变得更加的简单方便。手机给我们带来了便利,我们随身带着的手机可以集成许多的功能,其中就能够有日志的功能,因为方便携带所以我们不需要带上那保密性差,有容易遗失的日记本了,我们现在只需要用手机,就能够随时随地的记录下我们容易遗忘的事情,因此,我们设计了这么一款手机日志程序。本论文所设计与开发出的这款基于Android手机的日志,分析了Android系统的技术原理和实现策略,以更加合理和有效的方式实现了各个功能模块,最后将其有机结合在一起,成为一款实用的日志软件。本系统包括日志的添加,修改,删除等操作,为了让其更加实用,我们还搭配了闹钟的功能,使得界面简洁清晰,使用方便且人性化。2 安卓的概述2.1 Android简介 Android操作系统最初由Andy Rubin开发,最初主要支持手机。2005年由Google收购注资,并组建开放手机联盟开发改良,逐渐扩展到平板电脑及其他领域上。Android的主要竞争对手是苹果公司的iOS以及RIM的Blackberry OS。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2011年11月数据,Android占据全球智能手机操作系统市场52.5%的份额,中国市场占有率为58%。Android是一种以Linux为基础的开放源代码操作系统,主要使用于便携设备。目前尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,最初主要支持手机。2005年由Google收购注资,并组建开放手机联盟开发改良,逐渐扩展到平板电脑及其他领域上。Android的主要竞争对手是苹果公司的iOS以及RIM的Blackberry OS。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2012年2月数据,Android占据全球智能手机操作系统市场52.5%的份额,中国市场占有率为68.4%。2.2 Android平台特性1、应用程序框架支持组件的重用与替换。2、Dalvik虚拟机专为移动设备优化。3、集成的浏览器基于开源的WebKit引擎。4、优化的图形库包括定制的2D图形库,3D图形库基于OpenGLES1.0(硬件加速可选)。5、SQLite用作结构化的数据存储。6、多媒体支持包括常见的格式 (如MPEG4,H.264,MP3,AAC,AMR,JPG,PNG,GIF)。7、GSM电话技术(依赖于硬件)。8、蓝牙Bluetooth,EDGE,3G,和WiFi(依赖于硬件)。9、照相机,GPS,指南针,和加速度计(accelerometer)(依赖于硬件)。10、丰富的开发环境包括设备模拟器,调试工具,内存及性能分析图表,和Eclipse集成开发环境插件。2.3 Android用户界面构建 在Android平台下开发应用软件,最重要的是布局问题。一个好看而又简洁的界面,是相当重要的,既能提高使用者的体验,又保证应用的高效执行。Android生成用户界面有三种方式:xml配置生成、通过用户自己的界面接口生成和直接用代码生成。对于一个Activity应用来说,android.app.Activity类是一个最基本的功能单元。一个Activity实例可以做很多的事情,但是它本身无法显示在屏幕上,而是借助于View group和View,这两个是Android平台上最基本的两个用户界面表达单元。下面介绍下主要的布局对象: 线性布局(Linear Layout):以单一方向对其中的显示对象进行排列显示。 如以垂直排列显示,则布局管理器中将只有一列;如以水平排列显示,则布局管理器中将只有一行。同时,还可以对个别的显示对象设置显示比例2。 表格布局(Table Layout):以拥有任意行列的表格对显示对象进行布局,每个显示对象被分配到各自的单元格之中,但单元格的边框线不可见。 绝对布局(Absolute Layout):允许以坐标的方式,指定显示对象的具体位置,左上角的坐标为(0,0),向下及向右,坐标值变大。这种布局管理器由于对象的位置固定了,所以在不同的设备上,有可能会出现不一样的显示效果。 相对布局(Relative Layout):允许通过指定显示对象相对于其它显示对象或父级对象的相对位置来布局。一个按钮可以放于另一个按钮的右边,或者可以放在布局管理器的中央。 对于Android应用中的一个屏幕,它的屏幕元素是按层次结构来描述的。要将一个屏幕元素层次树绑定在一个屏幕上显示,Activity会调用它的setContentView()方法并且传入这个层次树的根节点引用2.4 资源的获取和使用 资源是外部文件(不含代码的文件),它被代码使用并在编译时编入应用程序。 Android支持不同类型的资源文件,包括XML、PNG以及JPEG文件。它们在运行的时候被解析,XML文件根据描述不同有不同的格式。源代码以及XML文件将资源打包并编译进二进制文件,这种模式能使得资源更快的被加载。字符串也同样被压缩成更高效的模式。 由于这些原因,Android平台上可以有不同的资源类型。Android资源系统能跟踪所有非代码相关的应用程序。程序开发者可以使用资源类来访问应用程序的资源,资源的实例通常和应用程序联系在一起,可以通过Context.getResources来访问。应用程序的资源在编译时就被编译到应用程序二进制代码里为了使用某个资源,程序开发者需要将它放在对应的代码目录结构里,然后编译。作为编译过程的一部分,产生的资源代号可以在源代码里使用,这就可以用编译器来验证程序代码和定义的资源是否相符。 Android的闹钟系统提供了警报和时间设置方面支持,其实现的硬件基础通 常是实时时钟设备。在Linux内核代码中,需要有实时时钟设备驱动程序和Android的Alarm驱动程序。警报器-实时时钟系统包含了JNI和JAVA层的接口,在JAVA应用程序层可以通过接口控制警报器方面的功能。3 功能设计概述与需求分析3.1 软件功能设计该系统的设计与实现主要包括以下几个方面的工作: 1.搭建基于Android系统平台的多功能日记本构架,设计包含了写日志,我的日记本,闹钟和闹钟情景模式,四个功能模块的日记本系统体系。 2.对日记本系统四个功能模块逐一论述需求分析,构建每一模块的基本功能和预期产生的效果。 3.采用面向对象的程序设计方法分别实现写日记、查看和修改日志、设定闹钟和修改闹钟选项四个功能模块。 4.分别对四个功能模块进行软硬件测试,在每一模块测试成功的基础上,完善整个日记本系统功能连调。 基于Android系统手机开发的日记本软件界面友好,操作便捷,具有良好的扩展性和可维护性。经过系统测试,该软件工作安全可靠,可以稳定运行。3.2 数据库设计该程序数据库是在Android平台上执行Java代码,通过DVM编译来建立的,由于整个SQLite数据库是非可视化操作,因此所有对数据库的操作都是通过执行Java代码实现。且表的设计也尽量优化,没有错综复杂的关系,每张表都是独立的,不存在任何约束,因此数据库也是独立数据库。3.3 需求分析日记本是很平常的东西,很多人都有记日记的习惯,有人记账,有人记事、有人记下心情。随着计算机技术的发展,很多家庭都买了手机,开始上网,开始使用电脑和手机来办公、打字等。所写现在也有很多的人在使用电脑说说,写博客,发帖子等等,受此启发我就萌生了编写一个日记本,用手机来写日记的想法。很多事我们不想忘记,于是写进日记本里,多年后翻出来再看看,很是惬意。大多数人都使用的是纸质的日记本,这中日记很难保存,容易丢失,也容易遭到水浸等物理破坏,这样我们的日记就丢了。同纸质的日记本相比较,用软件日记本不仅环保,而且安全方便,不怕被别人偷看。软件日记本可以很方便的携带只要存在手机里面就可以了。3.4 用户分析这个软件面向的用户是拥有手机的大众,而其具有写日记的习惯的人。用户使用的软件必须简单容易使用,界面得体,在此基础上尽可能多的提供人性化功能,丰富软件的内涵。同时软件必须尽量保证不会因用户的不当操作而使用户受到严重的经济、财产、精神损失。软件必须具有很强的可靠性,不会无故终止运行、死机、退出等。3.3.1用户要求具备基本功能a编写日记:包括添加日记和取消。b管理日记:包括保存及删除日记、按日期分组日记。c编辑闹钟:包括设定闹钟,和删除闹钟d设置魔石:包括设定闹钟的提醒方式和删除方式3.3.2除基本功能外,可另曾特色功能a闹钟音乐播放。b编辑闹钟提醒方式。3.5 系统体系结构系统主旨在建立系统的闹钟,日志等,主要有如下几个核心功能模块界面设置写日志闹钟设置查看日志欢迎界面主界面4 功能模块介绍4.1 欢迎界面添加联系人整个布局的主体采用默认的LinearLayout来呈现,采用TableRow的好处是对齐很方便,为了整体的美观,大多数情况都是用的Imageview和Imagebutton控件显示,如下图的代码和图4-1所示。 ImageButton android:id=+id/picmak android:layout_width=wrap_content android:layout_height=wrap_content android:layout_marginTop=130dp android:layout_marginLeft=150dp android:src=drawable/p6 android:background=#00000000 android:contentDescription=string/hello_world图4-14.2 主界面主界面里面就是通向其他界面的四个按钮,因为总体界面不是很大,所以我尝试使用了HorizontalScrollView控件,多数的代码都是由系统自动生成,我的工作就是给四个控件添加监听事件,如图4-2-1,4-2-2所示。图4-2-1图4-2-24.3 添加日记模块点开写日记,即可添加日记,因为日记需要保存信息,所以需要吧信息都保存在数据库中,我们首先要创建一个数据库,新建MyLiteHelper.java,然后创建一个数据库,数据库文件名称为my_note.db,因为Android的数据库是不是可视的,所以尽可能的把数据库能够书写的简单一点,部分代码如下。效果图如图4-3private SQLiteDatabase db;protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_write);imgbut1=(ImageButton) findViewById(R.id.imgbut1);imgbut2=(ImageButton) findViewById(R.id.imgbut2);houtui=(ImageButton) findViewById(R.id.houtui);w_tit=(EditText) findViewById(R.id.w_tit);w_cont=(EditText) findViewById(R.id.w_cont);db=new MyLiteHelper(this).getWritableDatabase();图4-34.4 编辑日志日志添加过后肯定需要有所改动,所以需要有添加、删除、修改的选项,而日志内容就需要接收之前存储的数据库。读取接收的部分代码如下。效果图如图4-4接收日志Intent intent=getIntent(); id=intent.getIntExtra(com.chao.note.id, 1); String tit=intent.getStringExtra(com.chao.note.tit); String cont=intent.getStringExtra(com.chao.note.cont); String datetime=intent.getStringExtra(com.chao.note.datetime);修改或者删除日志switch(arg0.getId()case R.id.imgbut1_1:String tit=edt_tit.getText().toString().trim();String cont=edt_cont.getText().toString().trim();String sql=update my_note set title=+tit+,content=+cont+ where id=+id+;db.execSQL(sql);Toast.makeText(ShowOneActivity.this, 保存成功., Toast.LENGTH_LONG).show();finish();break;case R.id.imgbut2_1:edt_tit.setText();edt_cont.setText();break;case R.id.imgbut3_1:AlertDialog.Builder builder=new Builder(ShowOneActivity.this);builder.setTitle(删除);builder.setIcon(R.drawable.t_sc);builder.setMessage(是否删除);builder.setPositiveButton(ok, new DialogInterface.OnClickListener() Overridepublic void onClick(DialogInterface dialog, int which) / TODO Auto-generated method stubString sql1=delete from my_note where id=+id;db.execSQL(sql1);Toast.makeText(ShowOneActivity.this, 删除成功, Toast.LENGTH_LONG).show();finish(););builder.setNegativeButton(否, null);builder.create().show();break;case R.id.houtui_1:finish();break; 图4-44.5 添加设置闹钟 闹钟与闹钟的情景模式是相互关联的,添加闹钟后可以再情景模式当中或者是闹钟设置当中选择提醒的方式,部分情景模式设置的代码如下,效果图如图4-5-1和4-5-2所示。hours = 0;minutes = 0;c = Calendar.getInstance();intent = getIntent();isnew = intent.getIntExtra(MY_ALARM_TYPE, 2); / 2表示新的,1 表示旧的type=常规模式;if (isnew = 1) hours = intent.getIntExtra(hours, 0);minutes = intent.getIntExtra(minute, 0);c.set(Calendar.HOUR_OF_DAY, hours);c.set(Calendar.MINUTE, minutes);num = intent.getIntExtra(num, 0);type = intent.getStringExtra(type);id = intent.getIntExtra(id, 0);tv.setText(你选定的时间是 + hours + 时 + minutes + 分 + id);if (type.equals(常规模式) radioone.setChecked(true);my_check = 1; else if (type.equals(震动模式) radiotwo.setChecked(true);my_check = 2; else if (type.equals(静音模式) radiothree.setChecked(true);my_check = 3;图4-5-1 图4-5-2自学心得安卓应用程序设计中,我遇到了很多的问题,但同时我也收获很多,设计开发过程初期,我一直都不清楚我要做一个什么样子的程序,所以一开始都是漫无目的的去做着登录界面,最近的几周都有考试,设计不是没有进展,只是比较缓慢,后来我发现我总是莫名的忘记一些事情,真巧最近有安卓程序设计,想着想着我就开始着手制作起日志和闹钟的程序了。但是,刚开始并不能预测难度,跟着书本我学习了许多控件的用法,先实现基本的逻辑框架,和界面框架,然后在此基础上进一步完善丰富,设计制作的过程中很多的函数、属性、成员名都是英文的,甚至连应用软件Eclipse也只有英文版的,大感头疼的我只能自己去翻英汉字典,或者网上查找。首先遇到的问题便是事件监听,我之前虽然做过类似的JAVA课程设计,但我并没有好好的掌握,自己的程序完成后产生大量的错误,最后还是迫不得已去使用网上已有的源代码和脚本,经过几番的调试,我终于算是完成第一个界面。一开始我用button做的界面,因为方便使用,很好的布局,但是每当扩充一种功能时,为了使界面整体美观,我换成了imagebutton,界面变得简单,使用方便。这次的自主学习中我学会了设置安装环境,也基本掌握了安卓的开发方法及基本流程。在本次开发过程中,安卓的设计中还需要用到的XML和SQL的语言,主要用到的知识有Activity的使用,在程序中用到了多个窗口,因而需创建多个Activity。主要是用于多个Activity之间的跳转。在开发期间,我学会了有目的的去学习一些将要用到的东西,仔细地考虑工作流程的规律和步骤,充分利用手中的开发工具,利用其所具备的功能,尽量使自己的开发在代码上实现少而精确、让用户能够尽量简单地进行操作。但是在检测过程中,还是出现了很多的不足之处,这些都是要在今后的工作中需要努力改进和完善的。 在这次程序开发设计中,我也难免会遇到不少困难,这主要是由于我对所用的开发环境并不是很熟悉,开发软件的经验不足。安卓开发用的语言是java,这次开发对我来说可以算是一次锻炼,整个开发过程并虽然不是很顺利,却使我从中充分体会到学习的快乐,开发的程序也在一步步得到完善。 虽然我只能完成一些基本的功能,好多设想都未实现,但是当我第一次在我的手机上用到了我自己开发的程序,我的顿时信心大增,整个学习的过程变得让人满足和愉悦。参考文献1.王保罗.Java面向对象程序设计M. 北京:清华大学出版社,2003年2 杜波依斯. MySQL技术内幕M. 第4版. 人民邮电出版社 , 2011年3 熊刚.基于.Android的智能手机的设计与实现D.武汉理工大学,2010 4 靳岩,姚尚朗.Android 发入门与实践D.人民邮电出版补, 2009附录:程序package com.chao.adapter;import java.util.List;import com.chao.model.MyAlarm;import com.chao.note.R;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;public class MyAlarmAdapter extends BaseAdapter private Context context;private List data;public MyAlarmAdapter(Context context, List data) this.context = context;this.data = data;Overridepublic int getCount() / TODO Auto-generated method stubreturn data.size();Overridepublic Object getItem(int arg0) / TODO Auto-generated method stubreturn data.get(arg0);Overridepublic long getItemId(int arg0) / TODO Auto-generated method stubreturn arg0;Overridepublic View getView(int arg0, View arg1, ViewGroup arg2) / TODO Auto-generated method stubView view;if(arg1!=null)view=arg1;elseview=LayoutInflater.from(context).inflate( R.layout.activity_alarm_list_item,null);TextView type=(TextView) view.findViewById(R.id.alarm_type);TextView time=(TextView) view.findViewById(R.id.alarm_time);MyAlarm ma=data.get(arg0);type.setText(模式:+ma.getType();time.setText(所设置的时间:+ma.getHours()+时+ma.getMinute()+分);return view;package com.chao.model;public class MyAlarm private int id;private String type;private int num;private int hours;private int minute;public MyAlarm(int id, String type, int num, int hours, int minute) this.id = id;this.type = type;this.num = num;this.hours = hours;this.minute = minute;public int getId() return id;public void setId(int id) this.id = id;public String getType() return type;public void setType(String type) this.type = type;public int getNum() return num;public void setNum(int num) this.num = num;public int getHours() return hours;public void setHours(int hours) this.hours = hours;public int getMinute() return minute;public void setMinute(int minute) this.minute = minute;package com.chao.model;public class MyTextView private String tit;private String wr_time;private String cont;private int id;public String getCont() return cont;public void setCont(String cont) this.cont = cont;public int getId() return id;public void setId(int id) this.id = id;public MyTextView(int id,String tit,String cont,String wr_time)this.tit=tit;this.wr_time=wr_time;this.id=id;this.cont=cont;public String getTit() return tit;public void setTit(String tit) this.tit = tit;public String getWr_time() return wr_time;public void setWr_time(String wr_time) this.wr_time = wr_time;package com.chao.note;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.widget.TextView;public class AboutUsActivity extends Activity private TextView tv2,tv3;Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_about_us);tv2=(TextView) findViewById(R.id.about_text);tv3=(TextView) findViewById(R.id.my_text);tv2.setText( 测试软件的过程中);tv3.setText( 如有问题或建议请联系我);Overridepublic boolean onCreateOptionsMenu(Menu menu) / Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.about_us, menu);return true;package com.chao.note;import java.util.Calendar;import com.chao.service.MyService;import com.chao.sqlitehelper.MyAlarmHelper;import android.os.Bundle;import android.app.Activity;import android.app.AlarmManager;import android.app.AlertDialog;import android.app.PendingIntent;import android.app.TimePickerDialog;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.database.sqlite.SQLiteDatabase;import android.util.Log;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.ImageButton;import android.widget.RadioButton;import android.widget.RadioGroup;import android.widget.RadioGroup.OnCheckedChangeListener;import android.widget.TextView;import android.widget.TimePicker;import android.widget.Toast;public class AlarmActivity extends Activity implements OnClickListener private ImageButton imgbut;private RadioGroup rg;private Button but_ok, but_exit;private Calendar c;private TextView tv;private AlarmManager alarmManager;private PendingIntent pdintent;/ private CheckBox check_box;private Intent myintent;private int isnew, ischeck;private Intent intent;private long longtime;private int num;private int hours, minutes, id;private String type;private RadioButton radio_one, radio_two;private int my_check = 1;private SQLiteDatabase db;private SharedPreferences prefs;Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_alarm);init();void init() ischeck = 0;/ check_box = (CheckBox) findViewById(R.id.check_box);radio_one = (RadioButton) findViewById(R.id.radio_one);radio_two = (RadioButton) findViewById(R.id.radio_two);tv = (TextView) findViewById(R.id.my_text);prefs = this.getSharedPreferences(my_time_count, Context.MODE_PRIVATE);num = prefs.getInt(my_count, -1);if (num = -1) SharedPreferences.Editor edit = prefs.edit();edit.putInt(my_count, 0);mit();num = 0;hours = 0;minutes = 0;c = Calendar.getInstance();myintent = getIntent();isnew = myintent.getIntExtra(MY_ALARM_TYPE, 2);/ num=Calendar.getInstance().getTimeInMillis();if (isnew = 1) / 2是新的,1是旧的hours = myintent.getIntExtra(hours, 0);minutes = myintent.getIntExtra(minute, 0);c.set(Calendar.HOUR_OF_DAY, hours);c.set(Calendar.MINUTE, minutes);num = myintent.getIntExtra(num, 0);type = myintent.getStringExtra(type);id = myintent.getIntExtra(id, 0);tv.setText(你选定的时间是 + hours + 时 + minutes + 分 + id);if (type.equals(one) radio_one.setChecked(true);my_check = 1; else if (type.equals(every) radio_two.setChecked(true);my_check = 2;imgbut = (ImageButton) findViewById(R.id.image_but_checktime);rg = (RadioGroup) findViewById(R.id.radioGroup_one);but_ok = (Button) findViewById(R.id.my_exit);but_exit = (Button) findViewById(R.id.button_ok);Log.e(我设置的num, num + );db = new MyAlarmHelper(this).getWritableDatabase();rg.setOnCheckedChangeListener(new OnCheckedChangeListener() Overridepublic void onCheckedChanged(RadioGroup arg0, int arg1) / TODO Auto-generated method stubswitch (arg1) case R.id.radio_one: my_check = 1;break;case R.id.radio_two: my_check = 2;break;);imgbut.setOnClickListener(this); / 设置我的监听器but_ok.setOnClickListener(this);but_exit.setOnClickListener(this);/* * check_box .setOnCheckedChangeListener(new * CompoundButton.OnCheckedChangeListener() * * Override public void onCheckedChanged(CompoundButton arg0, boolean * arg1) / TODO Auto-generated method stub if (arg1) ischeck = 1; * else ischeck = 0; ); */Overridepublic boolean onCreateOptionsMenu(Menu menu) / Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.alarm, menu);return true;Overridepublic

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论