Android第一行代码--活动
Activity
什么是Activity?
Activity
包含用户组件用于与用户进行交互。
onCreate()方法
每个Activity
都需要继承父类的OnCreate()
方法
setContentView()方法
给当前的活动加载一个布局
1 |
|
项目中添加任何资源都会在R
文件中生成一个相应的资源id
布局文件涉及的元素
Button
:插入一个按钮
1 |
|
android:id=@+id/id_name
:定义一个名为id_name
的id
android:id=@id/id_name
:引用一个名为id_name
的id
android:layout_width
:指定当前元素的宽度andorid:layout_height
:指定当前元素的高度match_parent
:当前元素与父元素一样宽android:text
:指定元素内显示的文字内容wrap_content
:当前元素的高度/宽度刚好能够包含内容
AndroidManifest文件中注册
活动注册声明需要放在
<application>
标签内通过
<activity>
标签进行注册andorid:name
指定注册的activity
- 由于
<manifest>
标签已经标明程序包名,因此使用.FirstActivity
即可标明activity
<intent-filter>
标签用于标明哪个活动首先启动,若没有定义主活动,那么该活动无法在启动器中看到或打开,该活动通常作为第三方服务器供其他应用在内部调用。
1
2<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/><android:label>
:指定活动中标题栏的内容,标题栏在活动的最顶部
Toast
Toast
是Android
系统提供的提醒方式。
1 |
|
findViewById()
方法用于获取在布局文件中定义的元素。- 返回值:
View
对象
- 返回值:
setOnClickListener()
方法为按钮注册一个监听器,点击按钮则会执行监听器中的OnClick()
方法。Toast()
方法有三个参数- 参数一:
Context
即是Toast
要求的上下文,活动本身就是一个Context
对象,因此将当前活动传入 - 参数二:
Toast
显示的内容 - 参数三:显示时长
- 参数一:
Menu
1 |
|
<item>
:用于创建具体的某一个菜单项android:id
:给菜单项指定唯一的标识符android:title
:给这个菜单项指定一个名称
onCreateOptionsMenu()方法
1 |
|
getMenuInflater()
方法用于获取Menuinflate
对象inflate()
方法用于给当前活动创建菜单- 参数一:通过哪个资源文件来创建菜单
- 参数二:指定我们的菜单项加载到哪一个
Menu
对象 - 返回值:布尔值
true
代表允许创建的菜单显示出来false
代表菜单无法显示
onOptionsItemSelected()方法
用于判断我们点击的是哪一个菜单项
1 |
|
销毁活动
- 点击
Back
键 - 使用
finsh()
方法
Intent
Intent
是Android
程序中各组件之间进行交互的一种重要方式
- 用于指定当前组件想要执行的动作
- 在不同组件之间传递数据
- 可用于启动活动、服务、广播等场景。
显式Intent
构造方法Intent(Context packageContext, Class<?>cls)
- 第一个参数:启动活动的上下文
- 第二个参数:想要启动的目标活动
StartActivity()
方法:
- 参数一:
Intent
参数 - 用于启动目标活动
隐式Intent
隐式Intent
不明确指出想要启动哪个活动,而是指定action
和category
,然后由系统分析哪个Intent
,并找出合适的活动。
<activity>
标签下配置<intent-filter>
内容用于指定活动能够相应的action
和category
1 |
|
1 |
|
更多隐式Intent的用法
隐式Intent
不仅可以启动自己程序内的活动,还可以其他程序的活动。
1 |
|
Uri.parse()
方法将网址字符串解析成一个Uri
对象setData()
方法接受一个Uri
对象,用于指定当前Intent
正在操作的数据。<data>
标签:用于更加准确地指定当前活动能够响应什么类型地数据。android:scheme
用于指定数据的协议android:host
指定数据的主机名android:port
指定端口android:path
指定路径andorid:mimeType
:指定处理的数据类型
向下一个活动传递数据
1 |
|
putExtra()
用于传递数据- 参数一:键值
- 参数二:需要传递的数据
getIntent()
方法用于获取到启动SecondActivity
的Intent
getStringExtra()
方法用来获取传递的数据
返回数据给上一个活动
startActivityForResult()
方法:用于启动活动,与startActivity()
方法不同的是该方法可以在活动销毁时返回一个结果给上一个活动。
- 参数一:
intent
对象 - 参数二:请求码,用于标识请求的
Activity
1 |
|
setResult()
方法
- 参数一:用于向上一个活动返回处理结果
- 参数二:将带有数据的
Intent
传递回去
使用startActivityForResult()
方法启动的活动,在被销毁时会毁掉上一个活动的onActivityResult()
方法,因此需要重写onActivityResult()
方法来得到返回的数据。
1 |
|
onActivityResult()
方法
- 参数一
requestCode
:启动活动时传入的请求码 - 参数二
resultCode
:返回数据时传入的处理结果 - 参数三
data
:携带返回数据的Intent
当点击Back
按键时,需要重写需要销毁活动中的onBackPressed()
1 |
|
活动的生命周期
返回栈
Android
使用任务(Task
)来管理活动,一个任务就是一组放在栈里的活动的集合,这个栈被称之为活动栈(Back Stack
)。
活动状态
- 运行状态:处于栈顶的活动
- 暂停状态:不处于栈顶但是仍然可见
- 停止状态:不处于栈顶且不可见,当需要内存时,停止的活动就会被系统回收
- 销毁状态:当一个活动移除栈中就处于该状态
活动的生成期
Activity
类定义的7个回调方法对应活动的生命周期
onCreate()
:活动第一次被创建时调用,该方法完成初始化操作。onStart()
:该方法由不可见转化为可见时调用onResume()
:该方法在准备好和用户进行交互的时候调用,此时该活动一定处于栈顶onPause()
:这个方法在系统准备启动或者恢复另一个活动的时候调用onStop()
:这个方法在活动完全不可见的时候调用。与onPause()
方法的区别在于,若启动一个新的活动是对话框的活动那么onPause()
方法会调用但是onStop()
方法不会被调用onDestory()
:这个方法在活动被销毁之前调用,之后该活动的状态变为销毁状态onRestart()
:这个方法在活动由停止状态变为运行状态之前调用- 完整生存期:活动在
onCreate()
方法和onDestory()
方法之间所经历的。 - 可见生存期:活动在
onStart()
方法和onStop()
方法之间所经历的 - 前台生存期:活动在
onResume()
方法和onPause()
方法之间所经历的
活动被回收
当活动A
调用活动B
,活动B
返回活动A
时,活动A
已经被回收,此时会通过onCreate()
重新创造活动A
,但是此时在活动A
的数据会消失,在活动销毁之前会调用onSaveInstanceState()
方法。该方法写到Bundle
类型的参数,并且听过方法用于保存数据。
1 |
|
而onCreate()
方法存在参数Bundle
。
活动的启动模式
启动模式有4种,分别是standard
、singleTop
、singleTask
和singleInstance
,可以通过android:launchMode
属性选择启动模式。
standard
:就是默认的模式,使用返回栈存储活动,即使调用的活动已经在栈顶,仍然会将该活动当成新的栈顶。此时栈中就会存在两个相同的活动。singleTop
:会改进standard
模式,当调用的活动已经存在栈顶时,不会再调用。但是会出现这种情况当活动A
调用活动B
,活动B
再次调用活动A
时,栈的情况A-->B-->A
,此时栈上会出现两个活动A
的实例。singleTask
:解决singleTop
出现多个相同实例的情况,若发现需要调用的活动,在栈上存在实例则直接取出该实例,而不会另外新增一个该活动的实例。并且把该活动之上的所有实例弹出栈。singleInstance
:指定了singleInstance
模式的活动会启用一个新的返回栈来管理这个活动。此时可以实现其他程序与自己的程序共享一个活动的实例,由于每个程序有自己的一个返回栈,若不采用该启动模式,相同活动在不同的返回栈中存在不同的实例也就不可能共享相同的实例了。