Android面试一(Activity面试)

一,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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值