2.1 Activity理解
2.1.1组件的特点
-
它的类必须实现特定接口或继承特定类
-
需要在配置文件中配置其全类名 Androidmanifest.xml
-
它的对象不是通过new来创建的, 而是系统自动创建的
- 它的对象具有一定的生命周期, 它的类中有对应的生命周
期回调方法
2.1.2 Actvity的定义
-
Activity, 直译为活动, 它是Android定义的四大
应用组件之一,也是最重要用得最多的. -
Activity用来提供一个能让用户操作并与之交
互的界面 -
一个应用有多个界面, 也就是包含多个Activity
-
打电话,发短信, 拍照,发邮件等功能都是通过
Activity来做的 -
Activity通过setContentView()方法来显示指定组件,该方法既可以接收View对象作为参数也可以接收布局文件对应的资源id作为参数。
2.1.3 Activity常用事件
-
onKeyDown(int keyCode,KeyEvent event):对应按键按下事件
-
onKeyUp(int keyCode,KeyEvent event):对应按键松开事件
-
onTouchEvent(MotionEvent event):对应点击屏幕事件
2.2 Intent和IntentFilter的理解
2.2.1Intent的理解
Intent, 直译为意图, 也就是你想要做什么或想要去哪?
- Intent是Activity, Service和BroadcastReceiver这三个应用
组件之间进行通信的信使
- 例如: 我要在Activity中启动另一个Actvity, 就必须使用
2.2.2 Intent对象
-
意图对象还可以携带数据
-
注意: Intent不是Android中的四大应用组件之一
2.2.3 Intent的分类
显式意图 : 明确指定的目标组件的意图
-
创建对象 : Intent(Context context, Class clazz)
-
何时使用 : 当操作当前自己应用的组件时使用
-
隐式意图 : 没有明确指定目标组件的意图
-
创建对象 : Intent(String action)
-
何时使用 : 当操作其它应用的组件时使用
2.2.4 IntentFilter的理解
在配置Activity时, 可以为Activity指定一个IntentFilter的配置
-
如果你的Activity希望其它应用能访问到, 需要配置<intent-filter>
-
如果你想启动其它应用的界面你必须用隐式intent, 且目标界面Activty配
置了<intent-filter> -
它的作用类似于web中的为Servlet配置的<url-pattern>
2.3 相关API
2.3.1 Intent: 意图
Intent(Context packageContext, Class<?> cls) : 用于创建显示意图对象
Intent(String action): 用于创建隐式意图对象
putExtra(String name, Xxx value): 保存额外数据
Xxx getXxxExtra(String name): 获取额外数据
setData(Uri data): 设置有特定格式的uri数据
2.3.2 Activity: 活动
startActivity(Intent intent): 一般启动Activity
startActivityForResult(int reqCode, Intent intent): 带回调启动Activity
onActivityResult(int reqCode, int resultCode, Intent data): 回调方法
setResult(int resultCode, Intent data): 设置要返回的结果
finish(): 结束当前Activity
getIntent(): 得到启动Activity的意图
sendBroadcast(Intent intent): 发送广播
startService(intent): 启动服务
2.3.3 Activity生命周期相关方法
onCreate()
onStart()
onResume()
onPause()
onRestart()
onStop()
onDestory()
2.3.4 View: 代表视图的根基类
setOnClickListener(OnClickListener listener): 设置点击监听
setOnLongClickListener(OnLongListener listener): 设置长按监听
SmsManager: 发送短信的工具类
static SmsManager getDefault() : 得到当前对象
sendTextMessage(...): 发送短信
2.3.5 设置点击监听的3种方式
• 方式一: Activity中添加监听:
view.setOnClickListener(OnClickListener);
其中: OnClickListener是一个接口实现类的对象
• 方式二: view.setOnClickListener(this);
然后使得当前操作所在的Activity实现OnClickListener接口
• 方式三: 布局添加监听:
layout中: android:onclick=“方法名”
Activity中: public void 方法名(View v) { }
• 设置长按监听
• view.setOnLongClickListener(OnLongClickListener)
2.4 编写Activity的基本步骤
- 定义Activity类的子类HelloActivity
- 在AndroidManifest.xml配置定义的组件
- 定义布局文件activity_hello.xml
- 重写Activity的onCreate(), 加载布局文件
2.4.1 启动一个Activity
一般启动
startActivity(Intent intent)
• 带回调的启动
startActivityForResult(int reqCode, Intent intent)
onActivityResult(int reqCode, int resultCode, Intent data)
• 如何携带额外数据
intent.putExtra(name, value)
• 如何获取携带的额外数据
Xxx intent.getXxxExtra(name)
• 如何得到启动的intent
Intent getIntent()
2.4.2 结束一个Activity
一般结束
finish()
• 带结果的结束
setResult(int resultCode, Intent data)
finish()
2.5 Activity界面的四种状态
-
运行状态: 可见也可操作
-
暂停状态: 可见但不可操作
-
停止状态: 不可见,但对象存在
-
死亡状态: 对象不存在
2.5.2 Activity的生命周期回调方法
-
onCreate(): activity对象被创建时调用,常用语初始化操作。如:设置布局、
初始化视图、绑定事件等 -
onStart(): 此时的activity还处于不可见状态,可见时执行
-
onResume(): 此时activity处于可见状态,且一定位于返回栈的栈顶,获取焦点
-
onPause(): 系统准备去启动或恢复另一个activity时调用, activity即将从可
见变为不可见状态,释放一些cpu资源,失去焦点 -
onRestart(): 此时的activity被重新启动了
-
onStop(): activity处于完全不可见时调用,进入后台时执行
-
onDestory(): 被销毁前调用,之后activity变为销毁状态
2.5.3 Activity生命周期与状态
image2.5.4 Activity从启动到关闭
Activity从启动到关闭时,会依次执行onCreate->onStart()->onResume()->onPause()->onStop()->onDestroy()方法。当Activity执行到onPause()方法失去焦点时,从新调用回到前台会执行onResume()方法。当执行到onStop()方法Activity不可见时,再次回到前台会执行onRestart()方法和onStart()方法,如果进程被杀死,Activity会重新执行onCreate()方法。
2.5.5 Activity存活
应用程序启动Activity01一次执行onCreate()->onStart()->onResume(),这个顺序是从第一Activity从创建到显示到前台到用户可点击的过程
当从Activity01跳转到Activity02的时候,Activity01首先会失去焦点执行onPause()方法,然后Activity02依次执行onCreat()->onStart()->onResume()方法从创建到前台可见,这时Activity01执行onStop()方法。
当Activity02点击返回键返回到Activity01时,Activity02先执行了onPause()方法,然后Activity01执行onRestart()->onStart()->onResume()方法,随后Activity02才彻底关闭,执行onStop->onDestroy()。在Activity01跳转到Activity02时,Activity01并没有执行finish()方法,而是执行了onStop()方法,因此从Activity02返回到Activity01时,Activity01执行了onRestart()方法。
当Activity失去焦点时,首先必然会执行onPause()方法,因此项目中需要保持数据时,可以在onPause方法中保存,同时,当两个Activity跳转时,Activity01会先失去焦点让Activity02得到焦点,等到Activity02完全显示在前台时Activity01才会切换到后台。
2.6 横竖屏切换时的生命周期
当手机横竖屏切换的时候,Activity会销毁重建,如果不希望在横竖屏切换时Activity被销毁重建,可以在AndroidManifest.xml文件中配置Activity的android:configChanges的属性,这样无论怎样切换Activity都不会销毁重新创建,具体代码如下
android:configChanges="orientation|keyboardHidden|screenSize"
如果希望某一个界面一直处于竖屏或横屏状态,不随手机的晃动而改变则可以在清单文件中通过设置Activity的参数来完成,具体代码如下
竖屏:android:screenOrientation="portrait"
横屏:android:screenOrientation="landscape"
2.7.1 Activity的TaskStack
在Android中,当一个应用启动时,Android就会为之创建一个任务栈,先启动的Activity压在栈低,后启动的Activity放在栈顶,通过启动模式可以控制Activity在任务栈中的加载情况。系统用Task Stack (Back Stack)结构来存储管理启动的
Activity对象
-
一个应用启动,系统就会为其创建一个对应的Task Stack来存储并管理该
应用的Activity对象 -
只有最上面的任务栈的栈顶的Activity才能显示在窗口中
2.7.2 Activity的4种launchMode
在Android中, 启动一个Activity有时需要创建一个新对象, 有时需要复用已
有的对象, 可以通过在配置activity时通过launchMode属性指定。launchMode属性值(4个)为:
standard: 标准模式
每次调用startActivity()方法就会产生一个新的实例。
这是默认的模式,系统不会判断该Activity在栈中是否存在,每次启动都会创建一个新的实例
singleTop:
当启动的Activity已经位于栈顶时,则直接使用它,不创建新的实例。如果启动的Activity没有位于栈顶时,则创建一个新的实例位于栈顶。
singleTask:
只有一个实例, 默认在当前Task中,每次启动Activity时,系统首先会检查栈中是否存在该Activity的实例,如果发现已经存在则直接使用该实例,并将当前的Activity之上的所有Activity出栈,如果没有发现则创建一个新的实例
singleInstance:
只有一个实例, 创建时会新建一个栈, 且此栈中不能有其它对象,无论从哪个任务栈中加载该Activity,只会创建一个实例,并且使用一个全新的任务栈来装载该Activity实例。采取这种模式启动Activity会分为两种情况:
- 如果启动的Activity不存在,系统会先创建一个新的任务栈,再创建该Activity的实例,并把该Activity加入栈顶
- 如果启动的Activity存在,无论位于哪个应用程序或者哪个任务栈中,系统都会把该Activity所在的任务栈转到前台,从而使Activity显示出来。
2.8 在Activity中使用Intent
Intent一般用于启动Activity、服务、发送广播,承担了Activity应用程序三大核心组件的相互通信功能。
2.8.1 Intent开启三个组件
方法声明 | 功能描述 |
---|---|
Activity | startActivity(Intent intent) startActivityForResult(Intent intent) |
Service | ComponentName.startService(Intent intent) boolean bindService(Intent service,ServiceConnection conn, int flag) |
BroadcastReceiver | sendBroadcast(Intent intent) sendBroadcast(Intent intent , String receiverPermission) sendOrderedBroadcast(Intent intent, String receiverPermission) |
2.8.2 数据传递方式
在Activity01中储存了数据,要将该数据传递到Activity02中,如下代码
String data="Hash";
Intent intent=new Intent(this,Activity02.class);
intent.putExtra("data",data);
startActivity(intent);
putExtra()方法中第一个参数是key,第二个参数是value,若想在Activity02中接收数据则
Intent intent=getIntent();
String data=intent.getStringExtra("data");
2.8.3 Bundle对象传递数据
Activity01携带数据
Bundle bundle=new Bundle();
bundle.putString("name","Hash");
bundle.putInt("age",20);
Intent intent=new Intent(this,ACtivity02.class);
intent.putExtras(bundle);
startActivity(intent);
Activity02接收数据
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
String stuName=bundle.getString("name");
int stuAge=bundle.getString("age");
2.9 回传数据
使用微博等社交软件时,在发布页面进入图库选择图片后,会回到微博发布页面并带回了图片选择页面的图片信息。由于这种需求十分常见,因此Android提供了一个startActivityForResult()方法。startActivityForResult()方法的第一个参数为Intent,第二个参数为请求码,用于判断数据来源
Activity01
Intent intent=new Intent(this,Activity02.class);
startActivityForResult(intent,1);
由于使用了startActivityForResult()方法启动Activity02,因此在Activity01页面需要重写回调onActivityResult()方法,来获取返回的数据
onActivityResult()方法第一个参数requestCode,表示启动Activity时传递的请求码;第二个参数resultCode表示在返回数据时传入的结果码;第三参数data表示携带返回数据的Intent。由于startActivityForResult()方法可能用于启动多个页面,而每一个页面的数据都会回传到onActivityResult()方法中,所以需要根据requestCode的值来判断数据来源于哪个Activity,再根据resultCode的值来判断数据处理结果
protected void onActivityResult(int requestCode,int resultCode,Intent data)
{
super.onActivityResult(requestCode,resultCode,data);
if(resultCode==1)
{
String data=data.getStringExtra("data");
}
}
Activity02中
Intent intent=new Intent();
intent.putExtra("data","Hash");
setResult(1,intent);
finish();
setResult()方法第一个参数resultCode结果码一般使用0,1;第二个参数则是把带有数据的Intent传递回去,最后调用finish()方法销毁当前Activity
网友评论