AndroidStudio项目开发教程-从基础入门到乐享开发 课件 第四章 基本程序单元Activity_第1页
AndroidStudio项目开发教程-从基础入门到乐享开发 课件 第四章 基本程序单元Activity_第2页
AndroidStudio项目开发教程-从基础入门到乐享开发 课件 第四章 基本程序单元Activity_第3页
AndroidStudio项目开发教程-从基础入门到乐享开发 课件 第四章 基本程序单元Activity_第4页
AndroidStudio项目开发教程-从基础入门到乐享开发 课件 第四章 基本程序单元Activity_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

第4章 基本程序单元Activity安卓·入门与开发目录4.1 Activity概述4.2 创建、配置、启动和关闭Activity4.3 多个Activity的使用4.4 使用Fragment4.5 购物商城界面的跳转和数据传递Android应用开发有四个基本组件,分别是活动(Activity)、服务(Service)、广播接收者(BroadcastReceiver)和内容提供者(ContentProvier)。其中,Activity是Android应用最常见的组件之一,它的中文意思是活动。在Android应用程序中,布局文件代表了用户看到的前端可视化界面,Activity则代表了可视化界面后台实现的功能。换句话说,布局和Activity共同实现了用户在APP上进行操作的人机交互功能。在一个Android应用中可以有多个Activity,这些Activity组成了Activity栈(Stack),当前活动的Activity位于栈顶,之前的Activity被压入下面成为非活动Activity,等待是否可能被恢复为活动状态。在Activity的生命周期中,有如表所示的4个重要状态。状态描述运行状态当Activity位于栈顶时,这时活动就处于运行状态,用户可见。最不会被系统回收的就是运行状态的活动暂停状态失去焦点的Activity,仍然可见,但是内存低的情况下,不能被系统回收。停止状态当Activity不处于栈顶位置,且完全不可见的时候,就进入停止状态,当内存较低时系统会回收这样的活动销毁状态该Activity结束,或Activity所在的虚拟器进程结束。4.1Activity概述在了解了Activity的4个重要状态后,再来看图,该图显示Activity的各种重要状态(活动指Activity),以及相关的回调方法。4.1Activity概述4.1Activity概述在图4.1中,矩形方块表示的内容为可以被回调的方法,而有底色的椭圆形则表示Activity的重要状态。从该图可以看出,在一个Activity的生命周期中有一些方法会被系统回调,这些方法及其描述如表所示。方法描述onCreate()Activity第一次启动时被调用,在该方法中初始化Activity所能使用的全局资源和状态,如:绑定事件,创建线程等。onStart()当Activity对用户可见时调用,即Activity展现在前端,该方法一般用来初始化或启动与更新界面相关的资源onResume()当用户与Activity进行交互时被调用,此时Activity位于返回栈的栈顶,并处于运行状态,该方法完成一些轻量级的工作,避免用户等待onPause()启动或恢复另一个Activity的时候被调用,该方法一般用来保存界面的持久信息,提交未保存的数据,并释放消耗CPU的资源。onStop()该方法在Activity不可见状态时调用,如:其他Activity启动或恢复并将其覆盖时调用。onDestroy()在Activity销毁之前被调用。onRestart()当Activity重新启动时调用。4.1Activity概述4.1Activity概述4.1 Activity概述4.2 创建、配置、启动和关闭Activity4.3 多个Activity的使用4.4 使用Fragment4.5 购物商城界面的跳转和数据传递4.2 创建、配置、启动和关闭Activity4.2.1创建Activity4.2.2配置Activity4.2.3启动和关闭Activity目录4.2.4Intent介绍4.2.5显式Intent和隐式Intent在使用Activity时,需要先对其进行创建和配置,然后才可以启动或关闭Activity。下面将详细介绍创建、配置、启动和关闭Activity的方法。使用AndroidStudio也可以很方便地创建Activity,具体步骤如下:

(1)在app节点上单击鼠标右键,在弹出快捷菜单上依次选择New>Activity>EmptyActivity,如图4.2所示。

图4.2创建EmptyActivity4.2.1创建Activity(2)在弹出地对话框中修改Activity的名称,如图4.3所示。

图4.3修改activity名称图(3)单击Finish按钮即可创建一个空的Activity和与之对应的布局文件。

4.2 创建、配置、启动和关闭Activity目录4.2.1创建Activity4.2.2配置Activity4.2.3启动和关闭Activity4.2.4Intent介绍4.2.5显式Intent和隐式Intent使用AndroidStudio向导创建Activity后,会自动在AndroidManifest.xml文件中配置与注册该Activity。配置Activity的基本格式如下:4.2.2配置Activity<activityandroid:name="实现类":指定对应的Activity实现类android:lable="说明性文字":指定标签android:theme="主题":设置要应用的主题。…><intent-filter><actionandroid:name="ent.action.MAIN"/><categoryandroid:name="ent.category.LAUNCHER"/></intent-filter></activity><activityandroid:name=".MainActivity"><intent-filter><actionandroid:name="ent.action.MAIN"/><categoryandroid:name="ent.category.LAUNCHER"/></intent-filter></activity>4.2创建、配置、启动和关闭Activity4.2 创建、配置、启动和关闭Activity目录4.2.1创建Activity4.2.2配置Activity4.2.3启动和关闭Activity4.2.4Intent介绍4.2.5显式Intent和隐式Intent1、启动Activity启动Activity分为以下两种

在一个Android应用中只存在一个Activity时,那么只需要在AndroidManifest.xml文件中对其进行配置,并且将其设置为程序的入口,这样,当运行该项目时,将自动启动该Activity。

在一个Android应用中存在多个Activity时,需要应用startActivity方法来启动需要的Activity。StartActivity方法的语法格式如下:

该方法没有返回值,只有一个Intent类型的入口参数。Intent是Android应用里各组件之间的通信方式,一个Activity通过Intent表达自己的“意图”。在创建Intent对象时,需要指定想要被启动的Activity。例如,要启动一个名称为“ShoppingCartActivity”的Activity,可以使用下面的代码:4.2.3启动和关闭ActivitypublicvoidstartActivity(Intentintent)Intentintent=newIntent(MainActivity.this,ShoppingCartActivity.class);startActivity(intent);4.2创建、配置、启动和关闭Activity

在Android中,如果想要关闭当前的Activity,可以使用Activity类提供的finish方法。finish方法的语法格式如下:该方法的使用比较简单,既没有入口参数,也没有返回值,只需要在Activity中相应的事件中调用该方法即可。4.2.3启动和关闭ActivityPublicvoidfinish()4.2创建、配置、启动和关闭Activity2.关闭Activity4.2 创建、配置、启动和关闭Activity目录4.2.1创建Activity4.2.2配置Activity4.2.3启动和关闭Activity4.2.4Intent介绍4.2.5显式Intent和隐式IntentIntent中文意思为“意图”。它是Android程序中传输数据的核心对象,在Android官方文档中,对Intent的定义是执行某操作的一个抽象描述。它可以开启新的Activity,也可以发送广播消息,或者开启Service服务。下面将对Intent及其基本应用分别进行介绍。一个Android应用程序主要是由Activity、Service和BroadcastReceiver三种组件组成,三种组件是独立的,它们之间可以互相调用、协调工作,最终组成一真正Android程序。这些组件之间的通信主要由Intent协助完成。Intent负责对应用中一次操作的Action(动作)涉及的Data(数据)、Extras(附加数据)进行描述,Android则根据Intent的描述找到相应的组件,将Intent传递给调用的组件并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件间互相调用的相关信息,实现调用者与被调用者之间的解耦。4.2.4Intent介绍4.2创建、配置、启动和关闭Activity4.2 创建、配置、启动和关闭Activity目录4.2.1创建Activity4.2.2配置Activity4.2.3启动和关闭Activity4.2.4Intent介绍4.2.5显式Intent和隐式Intent显式Intent是指在创建Intent对象时就指定接收者(如Activity、Service或者BroadcastReceiver),因为已经知道要启动的Activity或者Service的类名称。这里以Activity为例介绍如何使用显式Intent。在启动Activity时必须在Intent中指明要启动的Activity所在的类。通常情况下,在一个Android项目中,如果只有一个Activity那么只需要在AndroidManifest.xml文件中配置,并且将其设置为程序的入口。这样,当运行该项目时将自动启动该Activity。否则,需要应用Intent和startActivity方法来启动需要的Activity,即通过显式Intent来启动,具体步骤如下:创建Intent对象,可以使用下面的语法格式:Intentintent=newIntent(ContextpackageContext,Class<?>cls)intent:用于指定对象名称。packageContext:用于指定一个启动Activity的上下文对象,如MainActivity.this;cls:用于指定要启动Activity所在的类,如ShoppingCartActivity.class;例如,创建一个启动ShoppingCartActivity的Intent对象,可使用下面的代码:Intentintent=newIntent(MainActivity.this,ShoppingCartActivity.class);创建Intent对象后用startActivity方法来启动startActivity(intent);4.2.5显式Intent和隐式Intent4.2创建、配置、启动和关闭Activity显式Intent隐式Intent是指在创建Intent对象时不指定具体的接收者,而是定义要执行的Action、Category和Data,然后让Android系统根据相应的匹配机制找到要启动的Activity。使用隐式Intent启动Activity时,需要为Intent对象定义Action、Category和Data属性,然后再调用startActivity方法来启动匹配的Activity。例如,要在自己的应用程序中展示一个网页,就可以直接调用系统的浏览器来打开这个网页,而不必自己再编写一个浏览器。可以使用下面的语句实现:也可以使用下面的语句实现。4.2.5显式Intent和隐式Intent//创建Intent对象Intentintent=newIntent(Intent.ACTION_VIEW,Uri.parse(“”));//将Intent传递给ActivitystartActivity(intent);Intentintent=newIntent();//创建Intent对象intent.setAcition(Intent.ACTION_VIEW);//为Intent设置动作intent,setData=(Uri.parse(“”));//为Intent设置数据startActivity(intent);//将Intent传递给Activity4.2创建、配置、启动和关闭Activity隐式IntentIntent.ACTION_VIEW为Intent的Action,表示需要执行的动作。Android系统支持的标准Action字符串常量如表所示。Action常量对应字符串简单说明ACTION_MAINent.action.MAIN应用程序入口ACTION_VIEWent.action.VIEW显示指定数据ACTION_ATTACH_DATAent.action.ATTACH_DATA指定某块数据将被附加到其它地方ACTION_EDITent.action.EDIT编辑指定数据ACTION_PICKent.action.PICK从列表中选择某项并返回所选的数据ACTION_CHOOSERent.action.CHOOSER显示一个Activity选择器ACTION_GET_CONTENTent.action.GET_CONTENT让用户选择数据,并返回所选数据ACTION_DIALent.action.DIAL显示拨号面板ACTION_CALLent.action.CALL直接向指定用户打电话ACTION_SENDent.action.SEND向其他人发送数据ACTION_SENDTOent.action.SENDTO向其他人发送消息ACTION_ANSWERent.action.ANSWER应答电话ACTION_INSERTent.action.INSERT插入数据ACTION_DELETEent.action.DELETE删除数据ACTION_RUNent.action.RUN运行维护ACTION_SYNCent.action.SYNC执行数据同步ACTION_PICK_ACTIVITYent.action.PICK_ACTIVITY用于选择ActivityACTION_SEARCHent.action.SEARCH执行搜索ACTION_WEB_SEARCHent.action.WEB_SEARCH执行Web搜索ACTION_FACTORY_TESTent.action.FACTORY_TEST工厂测试的入口点4.2.5显式Intent和隐式Intent4.2创建、配置、启动和关闭Activity4.1 Activity概述4.2 创建、配置、启动和关闭Activity4.3 多个Activity的使用4.4 使用Fragment4.5 购物商城界面的跳转和数据传递4.3.1使用Bundle在Activity之间交换数据4.3 多个Activity的使用4.3.2调用另一个Activity并返回结果目录在Android应用中经常会使用多个Activity,而这些Activity之间又经常需要交换数据。下面就来介绍如何使用Bundle在Activity之间交换数据,以及如何调用另一个Activity并返回结果。当在一个Activity中启动另一个Activity时,经常需要传递一些数据。这时就可以通过Intent来实现,因为Intent通常被称为两个Activity之间的信使,通过将要传递的数据保存在Intent中,就可以将其传递到另一个Activity中去。在Android中可以先将要保存的数据存放在一个Bundle对象中,然后通过Intent提供的putExtras方法将要携带的Bundle对象保存到Intent中,最后通过执行Intent将数据传递出去。通过Intent传递数据的示意图如图4.4所示。图4.4通过Intent传递数据Bundles是一个键值对,用于保存要传递的数据包,数据类型可以为boolean、byte、int、long、double和String等基本类型或者对应的数组,也可以是对象或者对象数组。4.3.1使用Bundle在Activity之间交换数据4.3多个Activity的使用4.3.1使用Bundle在Activity之间交换数据4.3.2调用另一个Activity并返回结果4.3 多个Activity的使用目录

在Android应用开发时,有时需要在一个Activity中调用另一个Activity,当用户在Activity中选择完成后,程序将自动返回到第一个Activity中,第一个Activity能够获取并显示用户在第二个Activity中选择的结果。例如:程序中经常出现的“返回上一步”功能,可以通过Intent和Bundle来实现,与在两个Activity之间交换数据不同的是:此处需要使用startActivityForResult方法来启动另外一个Activity。调用startActivityForResult方法启动新Activity后,一旦关闭新启动的Activity,可以将选择的结果返回到原Activity中。startActivityForResult方法的语法格式如下:该方法将以指定的请求码启动Activity,并且程序将会获取新启动的Activity返回的结果(通过重写onActivityResult方法来获取)。RequestCode参数代表启动Activity的请求码,该请求码的值由开发者根据业务自行设置,用于标志请求来源。4.3多个Activity的使用4.3.2调用另一个Activity并返回结果PublicvoidstartActivityForResult(Intentintent,intrequestCode)4.1 Activity概述4.2 创建、配置、启动和关闭Activity4.3 多个Activity的使用4.4 使用Fragment4.5 购物商城界面的跳转和数据传递目录Fragment是Android3.0新增的概念,其中文意思是“碎片”,它与Activity十分相似,用来在一个Activity中描述一些行为或一部分用户界面。使用多个Fragment可以在一个单独Activity中建立多个UI面板,也可以在多个Activity中重用Fragment。例如,商城主界面就相当于一个Activity,在这个Activity中包含多个Fragment,底部4个功能界面相当于4个Fragment,可以随意切换。布局如图4.5所示。图4.5商城首页底部布局4.4 使用Fragment4.1 Activity概述4.2 创建、配置、启动和关闭Activity4.3 多个Activity的使用4.4 使用Fragment4.5 购物商城界面的跳转和数据传递4.4.1Fragment的生命周期4.4.2创建Fragment4.4.3在Activity中添加Fragment目录4.4 使用FragmentFragment和Activity一样有自己的生命周期。一个Fragment必须被嵌入到一个Activity中,它的生命周期直接受其所属的宿主Activity的生命周期影响。例如,当Activity被暂停时,其中的所有Fragment也被暂停;当Activity被销毁时,所有隶属于它的Fragment也将被销毁。然而,当一个Activity正在运行时(处于resumed状态),可以单独地对每一个Fragment进行操作,如添加或删除等。Fragment的完整生命周期如图所示。4.4使用Fragment4.4.1Fragment的生命周期4.4.1Fragment的生命周期4.4.2创建Fragment4.4.3在Activity中添加Fragment4.4 使用Fragment目录

创建一个Fragment'必须创建一个Fragment的子类,或者继承另一个己经存在的Fragment的子类。例如,要创建一个名称为“MineFragment”的Fragment”,并重写onCreateView方法,可以使用下面的代码:4.4使用Fragment4.4.2创建FragmentpublicclassMineFragmentextendsFragment{@Nullable@Override publicViewonCreateView(LayoutInflaterinflater,@Nullable ViewGroupcontainer,@NullableBundlesavedInstanceState){ Viewview=inflater.inflate(setLayoutID(),container,false); initView(view);//初始化控件 returnview; }}4.4.1Fragment的生命周期4.4.2创建Fragment4.4.3在Activity中添加Fragment4.4 使用Fragment目录直接在布局文件中添加Fragment。直接在布局文件中添加Fragment可以使用<fragment></fragment>标记实现。<LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"tools:context="com.example.administrator.fragmenttest.MainActivity"><fragmentandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:name="com.example.administrator.fragmenttest.LeftFragment"tools:layout="@layout/left_layout"/><fragmentandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="3"android:name="com.example.administrator.fragmenttest.RightFragment"tools:layout="@layout/right_layout"/></LinearLayout>4.4使用Fragment4.4.3在Activity中添加Fragment2、在Activity

运行时添加Fragment在Activity

运行时,也可以将Fragment

添加到Activity

的布局中,实现方法是:首先获取一个FragmentTransaction的实例;然后使用add方法添加一个Fragment,其中add方法的第一个参数是Fragment要放入的ViewGroup(由ResourceID指定),第二个参数是需要添加的Fragment;最后为了使改变生效,还必须调用commit方法提交事务。4.4.3在Activity中添加FragmentfragmentManager=getFragmentManager();FragmentTransactiontransaction=getSupportFragmentManager().beginTransaction();//实例化要管理的fragmentMineFragmentmineFragment=newMineFragment();//通过添加(事务处理的方式)将fragment加到对应的布局中transaction.add(R.id.right,mineFragment);//事务处理完需要提交mit();4.4使用Fragment4.1 Activity概述4.2 创建、配置、启动和关闭Activity4.3 多个Activity的使用4.4 使用Fragment4.5 购物商城界面的跳转和数据传递4.5.1商城首页的页面切换4.5.2个人中心-登录-注册页面的跳转4.5.3登录后跳转个人中心目录4.5 购物商城界面的跳转和数据传递在章节三中介绍了商城底部页面切换的原理,这里结合这章所讲Fragment碎片真正实现商城底部的页面切换。1、首先在MainActivity类里新建selectFragmentShow方法和addFragment方法。selectFragmentShow方法用于选择要显示的Fragment。在该方法中,首选判断Fragment集合中是否有元素,如果没有则调用addFragment方法添加。然后通过for语句判断Fragment集合中是否有选择的元素;如果有则让其显示,并将其他的Fragment隐藏,否则添加并显示。addFragment方法用于往Fragment集合添加元素。在该方法中根据FragmentTransaction管理器和fragment对象,添加元素并返回fragment集合。2、在包节点上单击鼠标右键,在弹出快捷菜单上依次选择New>Package,新建Fragment包,专门用于存放Fragment代码。3、在Fragment包节点上单击鼠标右键,出快捷菜单上,选择新建空白Fragment,命名为HomeFragment的首页碎片。4、点击finish会自动生成fragment代码和xml布局文件。5、后续会用到fragment的一些常用方法,为方便开发,创建一个公用基础类BaseFragment(1)在fragment包内,创建base包,用于存放公用基础类。(2)在base包内,新建基础类BaseFragment,继承Fragment类。(3)声明上下文对象和Activity对象。(4)重写onAttach方法,当视图被加载到Activity中时候调用。(5)重写onCreateView等方法,用于初始化控件、设置监听、设置功能等。6、在fragment包节点上单击鼠标右键,在弹出快捷菜单上,新建fragment,命名为HomeFragment,继承BaseFragment并实现View.OnClickListener监听器接口,然后重写setLayoutID()等方法,设置布局页面。7、同理创建一个Mineframent个人中心碎片,用于展示个人中心8、回到MainActivity类,在选择切换界面onCheckedChanged方法里,选择要显示的Fragment。如首页HomeFragment和个人中心MineFragment。4.5.1商城底部的页面切换4.5购物商城界面的跳转和数据传递9、运行项目,即可实现如图4.10所示的商城底部“首页”和“个人中心”的页面切换。图4.10商城底部切换图4.5.1商城底部的页面切换4.5购物商城界面的跳转和数据传递4.5.1商城首页的页面切换4.5.2个人中心-登录-注册页面的跳转4.5.3登录后跳转个人中心4.5 购物商城界面的跳转和数据传递目录在个人中心页面,用户要登录才能看到个人的相关信息,需要给fragment_mine帧布局的“登录/注册”textView组件在MineFragment类里添加一个点击监听事件,点击则跳转至登录页面。步骤是,先声明TextView控件变量,然后重写initView方法初始化绑定TextView,重写setListener方法,在其中为TextView设置点击监听器对象,最后重写Onclick方法实现点击跳转。4.5.2个人中心-登录-注册页面的跳转privateTextViewlogin;//登录/注册文本框@OverridepublicvoidinitView(Viewview){super.initView(view);login=(TextView)view.findViewById(R.id.custom_login);}@OverridepublicvoidsetListener(){login.setOnClickListener(this);}@OverridepublicvoidonClick(Viewv){switch(v.getId()){caseR.id.custom_login://登录注册文本框//跳转至登录页面Intentintent=newIntent(getActivity(),LoginActivity.class);startActivity(intent);break;}}4.5购物商城界面的跳转和数据传递运行项目,点击登录注册文本跳转至登录页面。如图4.11所示。图4.11个人中心-登录跳转图4.5.2个人中心-登录-注册页面的跳转4.5购物商城界面的跳转和数据传递

在LoginActivity中声明、初始化“马上注册”textView文本组件,在onClick方法里监听点击事件跳转至注册页面,具体代码如下:运行项目,点击“马上注册按钮”即可完成跳转。如图4.12所示图4.12登录-注册跳转图4.5.2个人中心-登录-注册页面的跳转caseR.id.mr_reg: Intentintent=newIntent(LoginActivity.this, RegisterActivity.class); startActivity(intent); break;4.5购物商城界面的跳转和数据传递4.5.1商城首页的页面切换4.5.2个人中心-登录-注册页面的跳转4.5.3登录后跳转个人中心4.5 购物商城界面的跳转和数据传递目录(1)商城登录后,可以用显示Intent的startActivityForResult进行Activity页面跳转并传递相关数据,重写LoginActivity类的onClick方法,添加如下代码:4.5.3登录后跳转个人中心@OverridepublicvoidonClick(Viewview){user=et_user.getText().toString();pwd=et_pwd.getText().toString();switch(view.getId()){caseR.id.mr_login://登录注册文本框if("".equals(user)||user==null||"".equals(pwd)||pwd==null){ Toast.makeText(LoginActivity.this.getApplicationContext(), "登录失败,账号或密码不能为空", Toast.LENGTH_LONG).show();}else{ Toast.makeText(LoginActivity.this.getApplicationContext(), "登录成功!账号为"+user+",密码为"+pwd, Toast.LENGTH_SHORT).show(); //登录成功后跳转至指定至主页面 Intentintent=newIntent(LoginActivity.this,MainActivity.class); //传递数据 intent.putExtra("user",user); intent.putExtra("pwd",pwd); startActivity(intent);}break;caseR.id.mr_reg: Intentintent=newIntent(LoginActivity.this,RegisterActivity.class); startActivity(intent); break;}}4.5购物商城界面的跳转和数据传递(2)在MainActivity接收数据并展示。在onCreate方法里用getIntent()获取传递意图,并用getStringExtra方法获取指定参数的对应值。判断用户是否非空,非空默认跳转至个人中心,表示登录成功。4.5.3登录后跳转个人中心@OverrideprotectedvoidonCreate(Bundlesave

温馨提示

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

评论

0/150

提交评论