Android面试一(Activity面试)

86 阅读3分钟

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时,会启动一个进程,一般是包名。