页面跳转
activity只要配置为启动界面的intent_filter,就会生成应用图标与名称
隐式意图:通过指定的action与data
显式意图:直接指定目标activity的包名和类名1
2
3
4
5
6
7<!--给activity配置intent-filter-->
<activity android:name=".mainActivity">
<intent-filter>
<action android:name="com.java.intent"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
隐式意图1
2
3
4
5
6
7
8
9
10
11
12
13Intent intent = new Intent();
intent.setAction("com.java.intent");
//下面两行代码不能共存
//intent.setData(Uri.parse(hello:123));
//intent.setType("text/username");
intent.setDataAndType(Uri.parse(hello:123), "text/username");
//若没有配置category,系统会自动添加默认的category
intent.setCategory(Intent.CATEGORY_DEFAULT);
Bundle bundle = new Bundle();
bundle.putString("username", name);
bundle.putString("password", password);
intent.putExtras(bundle);
startActivity(intent);
跳转后,获取数据1
2
3
4
5
6Intent intent = getIntent();
Uri uri = intent.getData();
String data = uri.toString();
Bundle bundle = intent.getExtras();
String username = bundle.get("username");
String password = bundle.get("password");
显式、隐式意图 应用场景
显式意图:启动用一个应用中的activity
隐式意图:启动不同应用中的activity
隐式意图效率要低于显式意图
如果系统中有多个activity与意图设置的action相匹配,那么在启动activity时会弹出对话框让用户选择启动哪一个应用。
返回activity时传递数据
应用场景:发送短信时,选择联系人1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Intent intent = new Intent();
intent.putExtra("name", "Jack");
//一旦这个activity被销毁,就会将结果返回给它的调用者,就是启动了这个activity的activity
setResult(0, intent);
//调用方
Intent intent = new Intent();
intent.setClass(MainActivity.this, Activity_2.class);
//第二个参数为请求码
startActivityForResult(intent, 0);
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
data.getStringExtra("name");
}
activity生命周期
完整生命周期:onCreate()->onStart()->onResume()->onPause()->onStop()->onDestory()
可视生命周期:onStart()->onResume()->onPause()->onStop()
前台生命周期:onResume()->onPause()
后台进入前台:onRestart()->onStart()->onResume()
1 | onCreate():被创建时调用的方法 |
使用场景:
1.应用程序退出自动保存数据 ondestory oncreate
2.应用程序最小化 暂停的操作 onstop onstart 视频播放器
3.游戏的暂停和开始 前台生命周期
内存不足时
系统会优先杀死后台activity所在的进程,都杀光了,如果内存还是不足,那么就会杀死暂停状态的activity进程,如果还不够,有可能杀死前台进程。
如果有多个后台进程,在选择杀死目标时,采用最近最少使用算法。
任务栈
- 任务栈(task stack) (别名 back stack 后退栈), 用来记录存放用户开启的activity,帮助维护好用户体验。
- 一个应用程序一被开启,系统就给他分配一个任务栈,当所有activity都退出的时候,任务栈就清空了。
- 任务栈的id(getTaskId())是Integer类型的,自增长的。
- 在 android 操作系统中会存在多个任务栈,一个应用程序一个任务栈。
- 默认情况下关闭掉一个应用程序,实际上是清空了这个应用程序的任务栈,应用程序的进程还会保留。
activity的启动模式
- standard 默认的标准启动模式,每次startActivity都会创建一个新的activity的实例,按照后进先出的原则将activity添加到任务栈中,每次可见的activity都位于任务栈的栈顶。
- singleTop 单一顶部,如果要开启的activity在任务栈的顶部已经存在,就不会创建新的实例,而是调用onNewIntent()方法。应用场景:浏览器书签。
- singleTask 单一任务栈,activity只会在任务栈里面存在一个实例,如果要激活的activity在任务栈里面已经存在,则不会创建新的activity,而是复用这个已经存在的activity,调用onNewIntent()方法,并且清空这个activity任务栈上面所有的activity。应用场景:浏览器activity。整个任务栈只有一个实例,节约内存、CPU。
注意:activity还是运行在当前应用程序的任务栈里面的 - singleInstance 单一实例 在整个手机操作系统中,只有一个实例存在,不同的应用打开这个activity,共享的是同一个activity。它会运行在自己单独,独立的任务栈里面,并且任务栈里面只有它一个实例存在。
在manifest清单文件activity节点下配置1
android:launchMode="standard"
横竖屏切换的生命周期
默认情况下横竖屏切换activity会被销毁并重新创建
应用启动(横屏):onCreate()->onStart()->onResume()
切换竖屏:onPause()->onStop()->onDestory()->onCreate()->onStart()->onResume()
两种解决方案:
1.让系统不要理会横竖屏切换(这样就不会重新触发生命周期方法)
在配置清单文件activity节点中添加1
android:configChanges="orientation|keyboardHidden|screenSize"
2.在配置清单文件activity节点中将屏幕朝向写死1
android:screenOrientation=""//portrait竖屏 landscape横屏