zoukankan      html  css  js  c++  java
  • 安卓面试精华(Activity部分)

    过几天小弟要去面试了,当然免不了要好好复习下功课,其实很多东西也不是特别清楚,今天都当作一个回顾和巩固,希望我的这篇文章能对即将去找工作的同学有所帮助。

    1.

    Q:什么是activity?

    虽然这个问题现在不流行问了,但是还是做好准备,有备无患嘛。

    A:      

    1).activity是四大组件之一,一般情况下,一个和用户交互的界面就对应有一个activity。

    2).Activity是Context的子类,同时它实现了Window.callback和keyEvent.callback,正因为如此,人们才能够实现与界面交互。比如我们熟悉的点击事件Button.setOnClickListener{}

    3).我开发常用的activity有listActivity(数据展示的),TabActivity(制作表格),PreferenceActivity(常用来写设置界面),有时候一些Activity都有一些共同的特点或者相同功能的时候,我会自己定义一个BaseActivity。

    2.

    Q:请说说Activity的生命周期?这个问题问得还挺多的)。

    A:我们三步走:

    第一步,解释:

    生命周期描述的是一个类从创建到消亡中会执行的方法,(注意,市讲的时一个个会执行的方法),在这个过程中,会针对不同的生命阶段调用不同的方法。其实讲白了就是一个个方法的执行过程。

    第二步,如何执行:

    接下来我们就要说都执行了哪些方法:

    Activity从创建到销毁有多种状态,从一种状态到另一种状态会执行相应的方法,包括Oncreate()—创建,OnDestory—销毁;OnStart()---可见,OnStop()—不可见;OnResume—获取焦点,OnPause---失去焦点;这些方法是两两对应,有一个执行了肯定有对应的执行。

    这里要注意一点,弹出对话框不会执行以上任何方法,理由是对话框本身就是Activity的一部分。

    最后还有一个方法,OnRestart(),这个方法在Activity被onStop后,但是没有被onDestroy,在再次启动此Activity时就调用onRestart(而不再调用onCreate)方法;如果是被销毁了,那就是调用onCreate()方法。

    第三步:用自己做过的项目来阐述以上怎么用法。比如说:

    客户端每次进入某个界面的时候都要看到最新的数据,这个刷新列表的操作 就放在onStart()的方法里面.在onStart()里面写填充数据的内容就ok了。

    做音乐播放器的时候,需要处理来电情况,那就虚报把播放断点保存起来,并把播放声音置位0,这些工作就可以放在OnStop里面做,然后要启动的时候,恢复断点,设置音量这些可以在OnStart里面做。

    我们在读文档的时候,会发现onPostResume()和OnPostCreate()这两个生命周期的方法,不过开发的时候没有用到过.

    3.

    Q:两个Activity之间跳转执行哪些方法?

    A:

    一般情况比如说有两个activity,分别叫A,B ,当在A里面激活B组件的时候, A 会调用 onPause()方法,然后B 调用onCreate() ,onStart(), OnResume() ,如果B覆盖了A,我们就看不到A了,那A还会调用OnStop方法,但是如果B透明的,还能看到底下的A的话就不会调用OnStop,因为只有不可见才会调用OnStop();

    4.

    Q说说横竖屏切换时候Activity的生命周期?

    A:这个和配置的清单文件有关系。

    1.如果不设置Activity的android:configChanges,切换屏幕时候会调用各个生命周期,依次是:

    onPause(),onStop(),OnDestory(),onCreate(),OnResume(),onStart();

    意思就是你先让他停止,然后就让它不可见,这样就可以销毁了,然后在重新创建,接着就是回去焦点,获取到之后就显示出来。

    1. 当你设置了Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法,通常作游戏开发,方向都是写死了的。

    5.

    如何把Activity设置成窗口样式?

             我们只需要在清单文件里面配置,你可以使用Android系统提供的dialog样式,也可以自己在value文件夹下的style.xml自己定义一个样式,然后设置到Activity上。

     6.

    Q:你后台的Activity被系统回收怎么办?如果后台的Activity由于某原因被系统回收可了,如何在被系统回收之前保存当前状态?

    A:我们来看下Activity是怎么存放的:我们很容易看到,越是在栈顶的 不容易被回收,系统会优先回收栈底的activity,要想保存好数据,我们需要复写一个方法:onSaveInstanceState(Bundle outState),相信这个方法大家都不陌生,因为我们写Activity的onCreate()基本都见到了调用这个方法super.onCreate(savedInstanceState);其实这个方法调用就是从保存的数据里面取出来:每次执行oncreate方法都会看Bundle是不是空的,不是就把数据取出来,取数据调用的就是super.onCreate(savedInstanceState);这个东西在应用在保存用户id上很常见。

    Java代码  
    1. protected void onSaveInstanceState(Bundle outState) {  
    2.     super.onSaveInstanceState(outState);  
    3.     outState.putLong("id", 1234567890);  
    4. }  

    7.Q:如何退出程序?

    A:你看我们要是每次退出程序都是 一个一个页面摁下来,界面一朵用户体验就不好了,我们退出可以有两种常用的方法:

    1. 我们通过抛异常,然后把这个异常的线程杀死的方法,也就是在异常捕获的代码中写android.os.Process.killProcess(android.os.Process.myPid());这样子就能实现介绍程序而不会出现强制退出的界面。
    2. 第二种就是新建定义一个App类,里面 整个应用程序的界面,在每一个Activity执行onCreate方法的时候,就把创建的Activity加入到全局的Activity集合里面,然后在你点击退出的里面把Activity一个个从集合里面移除就行了。具体实现如下:

    a)   我们需要写一个MyApplication.java类

    Java代码  
    1. public class MyApplication extends Application {  
    2. public List<Activity> activities;  
    3. @Override  
    4. public void onCreate() {  
    5.     super.onCreate();  
    6.     activities = new ArrayList<Activity>();  
    7. }  
    8. }  

    然后在每一个OnCreate里面添加activity

    Java代码  
    1. @Override  
    2.     protected void onCreate(Bundle savedInstanceState) {  
    3.         super.onCreate(savedInstanceState);  
    4.         MyApplication myApplication = new MyApplication();  
    5.         myApplication.activities.add(this);  
    6. }  

    接下来就是在要实现退出的地方移除所有Activity:

    Java代码  
    1. for(Activity activity: lists)  
    2. {  
    3.     activity.finish();  
    4. }  

     今天不早了,总结了几个消息,希望能对大家有帮助,明天继续。

  • 相关阅读:
    解决:Could not resolve archetype org.apache.maven.archetypes
    Spring MVC配置MyBatis输出SQL
    Spring集成MyBatis 通用Mapper以及 pagehelper分页插件
    关于SpringMVC或Struts2接受参数接收不到的原因
    配置quartz启动时就执行一次
    ajaxFileUpload进行文件上传时,总是进入error
    spring mvc注入配置文件里的属性
    java中将一个文件夹下所有的文件压缩成一个文件
    flume failed to start agent because dependencies were not found in classpath
    ubuntu不能安装pip unable to install pip in unbuntu
  • 原文地址:https://www.cnblogs.com/tianzhi9885/p/4165297.html
Copyright © 2011-2022 走看看