目录
如果 Activity A 启动一个透明的 Activity B,会经历哪些生命周期呢?
Activity是构建用户界面的基础组件,方便用户实现应用交互。可以看作单一的屏幕。
生命周期
Activity的生命周期可以分为7个部分,分别是onCreate,onStart,onResume,onPause,onStop,onDestory,onRestart。
onCreate | 创建 | 做初始化工作,setviewcontent界面资源,初始化资源 |
onStart | 启动 | Activity可见但此时不能与用户交互,此时可以看到活动界面,但是活动此时未获得焦点 |
onResume | 获得焦点 | Activity可见且在前台开始活动 |
onPause | 即将停止 | 做数据存储,停止动画等动作 |
onStop | 正在停止 | 轻量级回收工作,取消网络链接,注销广接收器 |
onDestory | 即将销毁 | 做回收工作,释放资源 |
onRestart | 重新启动 | 后台到前台,不可见到可见 |
如果有服务或事件需要注册,一般在onCreate中进行,相对应的解注册onregister也会在onDestory中进行。
从Activity A 跳转到Activity B,是先执行 A 的onPause(),还是先执行 B 的onResume()呢?
A 的onPause()会先执行,然后才执行 B 的onResume()
注意:在onPause中不能进行耗时的操作,否则会影响新Activity的显示,稍微重一点的操作可以放在onStop中,但依然不能太耗时。
如果 Activity A 启动一个透明的 Activity B,会经历哪些生命周期呢?
因为 B 页面透明, 所以跳转到 B 页面后,A 页面依然可见,因此就不会调用 Activity A 的 onStop 方法。
一般情况,A/B 均不是透明页面:
A 跳转 B 页面会经历的生命周期:A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume() -> A.onStop。
从 B 页面返回 A 页面经历的生命周期:B.onPause() -> A.onRestart() -> A.onStart() -> A.onResume() -> B.onStop()。
B是透明页面的情况:
如果 B 是透明的,A 跳转到 B:A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume()。
从 B 返回 A:B.onPause() -> A.onResume() -> B.onStop()。
启动方式-Intent
intent主要用于不同组件(活动Activity、服务service、广播broadcast)之间传递消息和数据,实现应用内部和应用之间的交互。
使用场景
启动活动(Activity)
Intent intent = new Intent(this,DetailActivity.class);
startActivity(Intent);
启动服务(service)
Intent intent = new Intent(this,Myservice.class);
StartService(Intent)
发送广播(broadCast)
Intent intent= new Intent("com.example.CUSTOM_ACTION");
SendBroadcost(Intent);
传递数据
Intent intent = new Intent(this,DetailActivity.class);
Intent putExtra("EXTRA_KEY","some date");
StartActivity(Intent);
与内容提供者交互(content Prproder)
启动方式
显示启动,隐式启动
显示启动
-
确保目标Activity在AndroidManifest.XML文件中声明
-
确保不同包的包名正确
-
显示启动一般用于应用内的内部组件之间的通信,因它直接指定了组件的类名
-
隐式启动
是指没有明确指定目标Activity,是通过Intent的Action,category,date等属性描述目标Activity,经过系统在AndroidManifest.XML匹配对应的Activity。
//启动Activity:
Intent intent1 = new intent();
intent1 setActivity("Android.intent.action.super");
startActivity(intent1);
-
确保在AndroidManifest.XML中设置了正确的intent-filter,包括action,category,date这些属性/scheme协议
-
常用于应用之间,应用与系统之间的通信,不直接指定Activity,而是根据intent的属性去查找匹配的组件
-
应确保目标应用已被安装,且有一个Activity可以影响这个应用
-
启动模式
任务栈(task stack):为了管理Activity的启动和导航
-
入栈(Push):当新的Activity被启动时,它会被推入任务栈的栈顶
-
出栈(Pop):当一个Activity完成任务或被用户销毁时,它会被任务栈移除
-
跨栈(Overlap):特殊情况下,新的Activity在当前Activity上显示
-
四种启动模式
standard
每次启动Activity时都会创建一个新的实例,并将其推入任务栈的栈顶
singleTop
如果任务栈中已经存在该Activity的实例,并且在找顶,则不再创建新的实例,直接使用栈顶的实例(调用栈顶Activity的onNewIntent函数,从intent里解析数据来刷新界面)。,如果该Activity不在栈顶,则会创建新的实例,并将其推到栈顶。
场景:点击推送消息,跳转的详情界面
singleTask
启动Activity之前检查整个任务栈是否有相同的Activity,如果当前前Activity不存在则实例化一个新的Activity,如果当前Activity在任务栈中已经存在,则会复用这个Activity实例,启动已经存在在Activity任务栈中但不在栈顶的Activity,同时把压在它前面的所有Activity弹出任务栈。
场景:忘记密码->重置密码后回到登陆界面重新登陆
singleInstance
全局单例,启动Activity时,重新为它分配一个任务栈,让该Activity独享一个任务栈,所有进程共享这个Activity所在的栈。适合需要与主程序分离的界面,业务上属于独立,单独栈运行与其他页面不相干与上述singleTask的规则2一样,只是task中只有一个Activity,如果在singleInstance的Activity又启动一个Activity,
则会再用被启动Activity的栈(独立于SingleInstance)
场景:闹钟
-
数据传递
传递数据-Intent:传递简单数据通常通过Intent的putExtra和getExtras方法来实现
返回数据-startActivityForResult:Activity在finish的时候需要向上一个Activity传值的时候,我们就可可以使用startActivityForResult。比如打开相册选取照片,拍照,关闭页面需要返回一个参数给打开我们的页面。使用startActivityForResult(Intent intent,int requestCode)方法打开新的Activity,新Activity关闭前需要向前面的Activity返回数据需要使用系统提供的setResult(int resultCode,Internt data),前面的Activity中通过onActivityResult(int requestCode, int resultCode, Intent data)方法接受回传值。