经典面试之Activity

1、activity的生命周期

    onCreate(Bundle savedInstanceState) 第一次创建时调用
    
    onStart()   被用户可见时调用
    
    onRestart()  当Activity处于stop状态又被重新启动时调用
    
    onResume() 当获得焦点即可与用户交互时调用
    
    onPause()  当失去焦点时调用
    
    onStop()   当不可见时调用
    
    onDestroy()  当销毁时调用
    
2、Activity的启动模式

    Android应用程序都是由一个或多个Activity组成的,而Android内部则是通过栈来对Activity
    
        进行管理的。所谓栈就是一个先进后出的数据结构。正常情况下栈顶的Activity就是当前Task
        
        显示的Activity,当我们按back键的时候该Activity便会出栈。然而事实并不是这么简单,
        
        google在对Activity任务栈进行设计的时候考虑到了一些特殊需求所以便有了Activity的启动
        
        模式之说。
        
    Activity的启动模式包含四种,分别是:standard、singleTop、singleTask、
    
        singleInstance,我们可以在manifest里通过Activity的launchmode进行指定。
        
    1)standard模式
        
            这是Activity的标准启动模式(默认模式),如果我们不对Activity做任何特殊处理的情况下就默认为该模
            
            式启动,所以该模式并不需要在manifest或者Intent里进行指定。这个模式的问题在于会导致
            
            一个任务栈里会有多个该Activity的实例存在,很简单的一个例子就是我们在AcitivytA里启
            
            动ActivityA这样就会有两个ActivityA存在。假如说该Activity非常消耗资源,那么就有必要
            
            考虑下更改下Activity的启动模式了。
            
    2)singleTop模式
        
            该模式简单来说,启动的Activity已经在任务栈的栈顶话,那么再启动这个Activity的时候
            
            就不会创建该实例,同时会调用该Acitivity的onNewIntent方法(前面有提过该方法)。但是
            
            如果该Activity不在栈定的话,那么启动它的行为与standard模式并没有什么区别。
            
    3)singleTask模式
        
            singleTask指的是一个任务栈中只能存在一个这样的Acitivity。但是需要我们注意的是如果
            
            任务栈中没有该Activity的话系统就会帮我们创建一个Acitivity压入栈顶,但是如果存在该
            
            Activity的话就会销毁压在该Activity上的所有Activity最终让创建出来的Activity实例处于
            
            栈顶,同时也会回掉该Activity的onNewIntent方法。
            
    4)singleInstance模式
        
            该模式是四个模式当中最为特殊的一个,设置了该模式启动的Acitivyt会在一个独立的任务栈
            
            中开启,同事该任务栈有且只有一个这样的Activity实例,每次再启动这个Activity的时候就
            
            会在该任务栈里重用该Activity同时回掉onNewIntent方法。
            
        singleInstace与singleTask的区别在于:singleTask启动的Activity在系统层面上来说是
        
        可以有多个实例的。比如说应用程序A想调用singleInstance模式下的ActivityA,而应用程
        
        序B也同样调用了,那么在应用程序A和B中就会各有一个ActivityA的实例。但如果该
        
        ActivityA是singleInstance模式的话,那么无论有多少个应用程序调用它,它都只可能在系统中
        
        存在一个实例同时该实例还是位于它自己的一个单独的任务栈中。
        
3、Activity运行状态

    运行    可见可交互
    
    暂停    可见不可交互
    
    停止    不可见不可交互
    
    销毁    啥都没有
    
4、8个案例

    锁屏:onpause()
    
    开屏: onResume()
    
    一个页面跳转另一个页面:
    
        整个页面
        
            A:onpause->onstop
            
            B:oncreate->onstart->onResume
            
        对话框页面
        
            A:onpause
            
            B:oncreate->onstart->onResume
 
    home键:onPause()  onStop()
    
    唤醒:  OnRestart()  OnResume();
    
    activity启动:onCreate() onStart()   onResume()
    
    退出程序:onPause()  onStop()   onDestroy()
    
    横竖屏切换: 横竖屏切换: ConfigOptions="";
    
                 如果配置了这个参数,只走onConfigOptionChange
                
                 如果没有配置,横竖屏切换各走两次
                
                 onSaveInStanceStale()  -->保存数据
                
                 onpause->onStop  相当于俩个页面切换
                
                 另一个:oncreate(Bundle恢复数据) onstart  onReSeaveInStance(还原数据)
                
5、Activity两种启动方式

    显示启动:new Intent(A.this,B.class)指明需要转向到的Activity,显式意图明确指定了要激活的组件是哪个组件,一般是在应用程序内部使用。
    
    隐式启动:隐式Intent:通过在清单文件中配置IntentFilter来实现的,它一般用在没有明确指出目标组件名称的前提下,当一个应用要激活另一个应用中的Activity时
    
        (看不到源代码),只能使用隐式意图,根据Activity配置的意图过滤器建一个意图,让意图中的各项参数的值都跟过滤器匹配,这样就可以激活其他应用中的Activity。
        
        Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。一般是用于在不同应用程序之间,如果想隐式
        

  1.         intent不可以被跨应用启动只需要在AndroidManifest.xml对应的activity中配置android:exported="false"即可。

6、Activity两种传值

    intent 传具体值
    
    bundle 传对象
    
7、隐式启动的不同方式

    1>根据action和Category进行匹配
    
    2>根据action和data进行匹配
    
    3>根据action和data的mimeType的属行进行匹配
    
8、回传思路

    1、使用startActivityForResult(Intent intent, int requestCode) 方法启动指定Activity。
    
    2、当前 Activity 需要重写 onActivityResult(int requestCode,int resultCode,Intent intent), 当被启动的Activity返回结果时,
    
        该方法将会被触发,其中requestCode代表请求码, 而resultCode代表Activity返回的结果码,这个结果码也是由开发者根据业务自行设定的。
        
    3、被启动的Activity需要调用setResult()方法设置处理结果。

9、传值的方式:

    intent
    
        广播
        contentprovider
        
        静态成员变量  
        
        sp
        
        数据库
        
        bundle
        
        eventbus
        
        接口回调  
        
        构造方法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值