Android知识点(二)之活动的使用
Toast
Toast是Android系统提供的一种非常好的提醒方式, 在程序中可以使用它将一些短小的信息通知给用户, 这些信息会在一段时间后自动消失, 并且不会占用任何屏幕空间
首先定义触发点:
活动中通过findViewById方法获取到在布局文件中定义的元素,来得到按钮的实例findViewById方法返回的是一个View 对象,需要向下转型将它转成Button 对象
然后设置监听器:
调用setOnClickListener方法为按钮注册一个监听器,点击按钮时执行监听器中的onClick方法。弹出Toast的功能要在onClick方法中编写。
最后写Toast事件:
Toast通过静态方法makeText() 创建出一个Toast 对象,然后调用show()将Toast显示出来。makeText() 方法需要传入3个参数。第一个参数是Context,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此直接传入FirstActivity.this 即可。 第二个参数是Toast显示的文本内容,第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
Menu
- res中创建一个menu文件夹,文件夹中创建menu文件,文件中创建菜单项, 标签就是用来创建具体的某一个菜单项,然后通过android:id 给这个菜单项指定一个唯一的标识符,通过android:title 给这个菜单项指定一个名称。
- 活动中重写方法实现菜单:ctrl+O
getMenuInflater() 方法能够得到MenuInflater 对象,再调用它的inflate() 方法给当前活动创建菜单。inflate() 方法接收两个参数,第一个参数用于指定通过哪一个资源文件来创建菜单,传入menu文件名。第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,使用onCreateOptionsMenu() 方法中传入的menu 参数。这个方法返回true, 表示允许创建的菜单显示出来,返回false,创建的菜单将无法显示。 - 为菜单设置点击事件
在FirstActivity中重写onOptionsItemSelected()方法,该方法中,通过调用item.getItemId() 来判断我们点击的是哪一个菜单项,然后给每个菜单项加入自己的逻辑处理 - 销毁活动,Activity类提供一个finish方法
Intent
- 显示intent
首先创建新的活动,然后为一个按键修改点击事件,点击事件中构造Intent对象;
Intent(Context packageContext, Class<?>cls)
构造函数接收两个参数,第一个参数Context 要求提供一个启动活动的上下文,第二个参数Class 则是指定想要启动的目标活动
最后Activity类中提供了一个startActivity(Intent intent) 方法,调用这个方法启动活动 - 隐式intent
通过在AndroidManifest.xml中 标签下配置的内容,指定当前活动能够响应action和category。
在 标签中我们指明了当前活动可以响应的action,而 标签则包含了附加信息,更精确地指明了当前的活动能够响应的Intent中还可能带有的category
只有 和 中的内容同时能够匹配Intent中指定的action和category时,这个活动才能响应该Intent。android.intent.category.DEFAULT 是一种默认的category,在调用startActivity() 方法的时候会自动将这个category 添加到Intent中。所以可以不主动添加这个category
< data>标签: - 向下一个活动传递数据,将数据存入intent,新开启的活动获得intent取出数据
- 向上返回数据
首先在第一个活动中开启下一个活动,Activity中有一个startActivityForResult() 方法也是用于启动活动的,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。startActivityForResult() 方法接收两个参数,第一个参数还是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。
然后在第二个活动中为intent传递的活动设置点击事件,把要传递的数据存放在Intent中,接着调用setResult()方法。这个方法专门用于向上一个活动返回数据的。 setResult()方法接收两个参数,第一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OK或RESULT_CANCELED 这两个值, 第二个参数则把带有数据的Intent传递回去, 然后调用了finish() 方法来销毁当前活动。
使用startActivityForResult() 方法来启动SecondActivity的,在SecondActivity被销毁之后会回调上一个活动的onActivityResult() 方法,因此需要在FirstActivity中重写这个方法来得到返回的数据
onActivityResult()方法带有三个参数,第一个参数requestCode,即在启动活动时传入的请求码。第二个参数resultCode,即我们在返回数据时传入的处理结果。第三个参数data, 即携带着返回数据的Intent。 由于在一个活动中有可能调用startActivityForResult() 方法去启动很多不同的活动,每一个活动返回的数据都会回调到onActivityResult() 这个方法中, 因此首先要做的就是通过检查requestCode的值来判断数据来源。确定数据是从SecondActivity返回的之后,我们再通过resultCode 的值来判断处理结果是否成功。 最后从data 中取值并打印出来。
如果不是通过点击而是通过back返回,在活动中重写onBackPressed()函数即可
生命周期
1. 活动状态
- 运行状态,当一个活动位于返回栈的栈顶时,活动处于运行状态
- 暂停状态,当一个活动不再处于栈顶状态,但仍可见,活动进入暂停状态
- 停止状态,当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入停止状态。系统仍然可能会为这种活动保存相应的状态和位置,但如果出现内存缺少,处于停止状态的活动可能会被回收。
- 销毁状态,当一个活动从返回栈移除之后成为销毁状态,系统倾向于回收该类活动。
2.活动的生存期
3.活动的启动模式
应该根据特定的需求为每个活动指定恰当的启动模式。启动模式一共有4种,分别是standard、 singleTop、 singleTask和singleInstance,可以在AndroidManifest.xml中通过给 标签指定android:launchMode 属性来选择启动模式。
standard是活动默认的启动模式,在不进行显式指定的情况下,所有活动都会自动使用这种启动模式。Android是使用返回栈来管理活动的,在standard模式下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于使用standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在, 每次启动都会创建该活动的一个新的实例。举例:Intent intent=new Intent(FirstActivity.this, FirstActivity.class);
singleTop模式,当活动的启动模式指定为singleTop, 在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。
singleTask模式,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例, 如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
singleInstance模式下会有一个单独的返回栈来管理这个共享的活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题
我们假设SecondActivity采用的是singleInstance模式