一,Activity生命周期
onCrate(),onStart(),OnResume(),onPause(),onStop(),onDestory()
1,4种状态
running/paused/stopped/killed
stopped:不可见,被另一个Activity覆盖,如果内存不紧张,成员变量还会在
2,生命周期分析
2.1,启动: onCreate(),onDestory:Activity创建了,销毁了.
onStart(),onStop():可见了,不可见了.
onResume(),onPause():可以与用户交互了,不可交互了,从位于前台(UI最顶层)的角度考虑,如弹出弹框不可交互时也会调用这组方法。
2.2, 点击home返回到主界面:
onPause():转入后台运行,保存信息 onStop():如果手机内存紧张,系统会直接结束activity,不会执行该方法,所以保存状态信息在onPause()执行。
再次回到Activity时: onReatart()由不可见变为可见状态 onStart() OnResume
退出当前Activity: onPause() onStop() onDestroty()
2.3, 从A界面打开B界面:
A onPause() => B onCreate(),onStart(),onResume() => A onStop()
从B界面点击返回时:
B onPause() => A onRestart(),onStart(),onResume() =>B onStop(),onDestroy()
2.4,内存不足,杀死了activity:
onPause() => onStop() => 直接杀死当前activity。当再次返回到activity时:会再次调用onCreate() => onStart() =>onResume()
3,Android进程优先
前台:处于和用户交互,或前台Activity绑定了service
可见:用户可见但不能点击
服务:后台开启了service服务
后台:按了home键
空进程:以上之外的,优先级最低
二,Android任务栈(先进后出)
1,启动模式
standard:标准的模式,不会复用Activity,每创建一个Activity都会走一个完整的生命周期。
singleTop:栈顶复用模式,每次创建Activity时,如果该Activity在栈顶,则会复用该Activity。(FLAG_ACTIVITY_SINGLE_TOP)。
singleTask:单例模式,如果栈内存在,则会把Activity设为栈顶,其上的activity都会从栈内销毁。相当于给设置FLAG_ACTIVITY_CLEAR_TOP。
singleInstance:独享一个栈。
设置的标签还有:FLAG_ACTIVITY_NEW_TASK,A打开设置该标签的B,如果B设置了TaskAffinity,并拥有相同的task栈,则压入该栈,否则压入新栈,如果没有设置TaskAffinity,则压入A所在的栈。也就是说,在同一应用跳转,不会建新栈。
1.1,栈顶到栈底 A,B,C,其中AB是standard模式,C是singleTask模式,从A打开C,栈内情况?A如何给C传值?
答:栈内只有C,可以在C界面重写onNewIntent()方法,调用setIntent()方法重新给intent赋值。
2,scheme跳转协议
3种跳转模式:
服务器定制化跳转APP页面;app通过Scheme跳转到另一个APP页面;通过h5页面跳转到原生页面
在需要跳转的目标activity配置:
<activity android:name=".SchemeActivity">
<intent-filter>
<data android:scheme="scheme" android:host="goodgoodstudy" android:path="/first"/>
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
activity跳转时代码:
String url = "scheme://goodgoodstudy/first?name=柯南";
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(url));
startActivity(intent);
目标activity获取传过来的参数:
Uri data = getIntent().getData();
Log.i("SchemeActivity","host = "+data.getHost() +" path="+data.getPath() +" query="+data.getQuery());
Log.i("SchemeActivity","param = "+data.getQueryParameter("name"));
HTML跳转:
<a href="scheme://goodgoodstudy/first?name=柯南">跳转至SchemeActivity</a>
三,android是怎么start一个Activity的
引用任玉刚的话:Activity的启动过程,我们可以从Context的startActivity说起,其实现是ContextImpl的startActivity,然后内部会通过Instrumentation来尝试启动Activity,这是一个跨进程过程,它会调用ams的startActivity方法,当ams校验完activity的合法性后,会通过ApplicationThread回调到我们的进程,这也是一次跨进程过程,而applicationThread就是一个binder,回调逻辑是在binder线程池中完成的,所以需要通过Handler H将其切换到ui线程,第一个消息是LAUNCH_ACTIVITY,它对应handleLaunchActivity,在这个方法里完成了Activity的创建和启动,接着,在activity的onResume中,activity的内容将开始渲染到window上,然后开始绘制直到我们看见。
(1)首先Android系统启动过程中,会执行以下逻辑:
Zygote进程:所有Android进程的父进程,其他进程都是该进程fork出的。该进程是通过Linux系统的init进程启动的。
SystemServer进程:启动系统的各项服务,如AMS,PMS,WindiwManagerService服务等;
应用进程:编译自己的APP时,会启动一个进程,一般是包名。
activity启动时,是应用进程和SystemServer进程相互配合启动的。应用进程负责执行activity的启动过程,回调生命周期等,SystemServer进程负责调用其中的服务,将activity保存在栈中,协调各种系统资源等。
(2)正题:启动activity的流程!
startActivity->Activity.startActivity()->Activity.startActivityForResult:requestCode传-1,只有requestCode>等于0时才会回调。
Instrumention.execStartActivity->ActivityManagerNative.getDefault().startActivityAsUser()
(2.1)Instrumentation类:是Android系统中启动Activity的一个实际操作类,activity在应用进程端的启动实际是该类执行的。
https://blog.csdn.net/qq_23547831/article/details/51224992