Android面试四大组件基础知识点

四大组件是什么

目录

一.activity

生命周期图
这里写图片描述

1.一个Activity通常就是一个独立的窗口,Activity各种情况下的生命周期

①正常情况的生命周期
onCreate –>onStart–>onResume–>onPause–>onStop–>onDestory

②横竖屏切换的时候
如果突然旋转屏幕,由于系统配置发生了改变,在默认情况下,Activity就会被销毁并重新创建
这里写图片描述
在Activity中添加android:configChanges="orientation|keyboardHidden|screenSize"属性可以避免Activity生命周期被回调

③Activity上弹出Dialog,弹出时然后按Home键时的生命周期
Activity上弹出Dialog:onCreate–>onStart–>onResume
当启动和退出Dialog时,Activity的状态始终未变,,因为Dialog实际上时一个View,它是属于某一个Activity的,因此如果Dialog显示在当前Activity之前时不会影响到Activity的生命周期的
dialog弹出时按Home键:onPause–>onStop

整个流程如下:
这里写图片描述
④前台切换到后台,然后再回到前台,Activity生命周期回调方法。
这里写图片描述
⑤两个Activity 之间跳转
MainActivity 和 DragActivity
这里写图片描述
MainActivity 经历的周期:onCreate–>onStart–>onResume–>onPause–>onStop–>onRestart–>onStart–>onResume
DragActivity 经历的周期:onCreate–>onstart–>onResume–>onPause–>onStop–>onDestory

2.Activity之间的通信方式

 Activity之间通过Intent进行通信
一个 Activity 启动另一个名为 SignInActivity 的 Activity
Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);

3.android应用中的每个Activity都应该在AndroidManifest.xml配件文件中声明,否则系统将不识别也不执行该Activity

4.活动被回收,Activity状态保存于恢复

Activity提供了onSaveInstanceState()回调方法,这个方法可以保证在活动回收之前被调用,
onSaveInstanceState()方法会携带一个Bundle类型的参数,Bundle提供了一些方法用于保存数据

 @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("data", "保存数据");
    }

保存的数据在onCreate()方法中可获取

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if(savedInstanceState!=null){
        String data = savedInstanceState.getString("data");
        }
 }

5.Activity的四种启动模式对比

①Standard:系统默认的启动模式,每次启动一个activity都会创建一个新的实例,不管这个实例是否存在

②SingleTop:栈顶复用模式,如果activity已经在任务栈的栈顶了,当再次启动同一个activity的时候,这个activity不会被重新创建,而且它的onNewIntent()方法会被调用
适合接受通知启动的内容页面,例如:某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。

③SingleTask:栈内复用模式,只要activity存在栈内,那么多次启动activity都不会重新创建实例,再次启动时该实例被移到栈顶,系统会调用它的onNewIntent()方法
适合做程序的入口点,例如浏览器的主界面,不管从多少个应用启动浏览器,只会启动主界面一次,其余的情况都走onNewIntent,并且会清空主界面上面的其他页面

④SingleInstance:此模式的activity只能单独位于一个任务栈中,
*适合需要与程序分离的页面
例如:闹铃提醒,将闹铃提醒与闹铃设置分离*

6.AlertDialog,popupWindow,Activity区别

二.service

1.Service 的生命周期

这里写图片描述

2.Service的开启,停止方式

启动服务

Intent startIntent = new Intent(this,MyService.class);
startService(startIntent);

停止服务

Intent stopIntent = new Intent(this,MyService.class);
stopService(stopIntent);

3.Activity 怎么和Service 绑定并进行数据交互

用Binder 对象连接活动和服务
在service中

private DownloadBinder downloadBinder = new DownloadBinder();
    class DownloadBinder extends Binder {
        public int getProgress() {
            return 0;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        Log.v(TAG, "onBind: ");
        return downloadBinder;
    }

在Activity中创建ServiceConnection的匿名内部类,重写onServiceConnected()和onServiceDisconnected()方法

private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
        //在Activity中调用Binder中的方法
            MyService.DownloadBinder binder = (MyService.DownloadBinder) service;
            int progress = binder.getProgress();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

绑定服务

Intent startIntent = new Intent(this,MyService.class);
bindService(startIntent,connection,BIND_AUTO_CREATE);
//BIND_AUTO_CREATE 在活动和服务绑定后自动创建服务

解绑服务

unbindService(connection);

4.怎么在Activity 中启动自己对应的Service

三.broadcast

1.请描述一下广播BroadcastReceiver的理解

①是四大组件之一,主要用于接受APP发送的广播
②内部通信实现机制:通过android系统的Binder机制
③广播主要分为两种类型

  • 标准广播:是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎同时都会在同一时刻受到这条广播消息,这种广播的效率比较高,但同时也意味着它是无法被截断的
  • 有序广播:是一个同步执行的广播,广播发出后,同一时刻只有一个广播接收器能够受到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所有此时的广播接收器是有先后顺序的,优先级高的先受到广播,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法接收到广播消息了

2.广播的分类,本地广播和全局广播有什么差别

  • 全局广播:即发出的广播可以被其他任何应用程序接收到,并且也可以接收来自其他任何应用程序的广播。这样会很容易引起安全性问题
  • 本地广播:本地广播机制的发出的广播只能在应用程序的内部进行传递,并且广播接收器只能接收来自本应用程序发出的广播

3.广播使用的方式和场景

  • 创建一个广播接收器,新建一个类让它继承BroadCast,并重写onReceive()方法就行
  • 使用场景:
    1.App全局监听,这种主要用于在AndroidManifest中静态注册的广播接收器,一般我们在收到该消息后,需要做一些相应的动作,而这些动作与当前App的组件,比如Activity或者Service的是否运行无关,比如我们在集成第三方Push SDK时,一般都会添加一个静态注册的BroadcastReceiver来监听Push消息,当有Push消息过来时,会在后台做一些网络请求或者发送通知等等。
    2.组件局部监听,这种主要是在Activity或者Service中使用registerReceiver()动态注册的广播接收器,因为当我们收到一些特定的消息,比如网络连接发生变化时,我们可能需要在当前Activity页面给用户一些UI上的提示,或者将Service中的网络请求任务暂停。所以这种动态注册的广播接收器适合特定组件的特定消息处理

4.在manifest 和代码中如何注册和使用BroadcastReceiver

  • 动态注册:在代码中注册,动态广播最好在Activity 的 onResume()注册、onPause()注销,在onResume()注册、onPause()注销是因为onPause()在App死亡前一定会被执行,从而保证广播在App死亡前一定会被注销,从而防止内存泄露
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.intent.action.ACTION_SHUTDOWN");
registerReceiver(new CommonBroadcastReceiver(),intentFilter);
  • 静态注册:在AndroidManifest.xml中注册
<receiver android:name=".broadcast.CommonBroadcastReceiver">
            <intent-filter>
                <!-- 关机广播 -->
                <action android:name="android.intent.action.ACTION_SHUTDOWN" />
            </intent-filter>
</receiver>

四.contentProvider

1.谈谈你对ContentProvider的理解

ContentProvider管理android以结构化方式存放的数据。他以相对安全的方式封装数据并且提供简易的处理机制。Content provider提供不同进程间数据交互的标准化接口。保证被访问数据的安全性。内容提供器可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险。

2.说说ContentProvider、ContentResolver、ContentObserver 之间的关系

ContentResolver中提供了一系列的方法用于对数据进行CRUD,内容URI给内容提供器ContentProvider中的数据建立了唯一标识符,ContentObserver监听Uri数据的变化

猜你喜欢

转载自blog.csdn.net/luyuqin0115/article/details/79815560