zoukankan      html  css  js  c++  java
  • Android四大组件知识整理


    ###1. Activity

    1.1 什么是Activity?

    Activity是Context的子类,并可以处理与窗体用户的事件;
    

    1.2 Activity的生命周期

    不存在->`onCreate()`->`onStart()`->`onResume()`->`onPause()`->`onStop()`->`onDestory()`; 
    

    1.3 横竖屏切换生命周期;

    当没有设置android:configChanged时,切屏会重新调用各个生命周期,默认首先会销毁当前Activity,  然后重新加载;
    如果设置了android:configChanged时,切屏时就不会重新调用各个生命周期,只会调用`onConfigurationChangded()`方法;
    

    1.4 Activity的启动模式

    • standard模式,每次激活Activity时,都会重新创建Activity实例,并放入Activity栈中;
    • singleTop模式,激活Activity时,会先判断任务栈顶是否存在该Activity的实例,如果存在,则重用该实例,否则就重新建立一个新实例;
    • singleTask模式,激活Activity时,会判断任务栈里是否存在该Activity的实例,如果存在,则重用该实例,并将处于该实例的其他Activity出栈,将该Activity实例置于栈顶;
    • singleInstance模式,在一个新栈中创建一个Activity实例,一旦该模式中的Activity存在于某个栈中,则任何再激活该Activity的应用,都会重用该栈中的实例。

    1.5 后台Activity被系统回收,应怎样保存Activity的状态?

    在onSaveInstance()方法中保存Activity状态,在重新创建该实例时,在onCreate()方法中,判断saveInstance是否为空,如果不空,则恢复Activity的状态;
    

    1.6 Activity中数据的传递

    基本类型的数据,如int,String等,通过Intent来传递数据;可以让对象实现序列化接口,然后也可以通过Intent传递数据;
    

    2. Service

    2.1 什么是Service?

    Service是应用程序执行一些长时间运行在后台,不用与用户交互的任务的组件,或者是为其他的应用程序提供服务的;同样的,(如果没有指明Service的运行进程)Service默认是运行在UI主进程中的,因此不能在Service中执行一些耗时的操作,耗时操作可以重新启动一个新线程来执行。
    

    2.2 Service生命周期

    Service的完整周期方法为:

    • 非绑定情况下:onCreate()->onStartCommand()->onDestroy(),
    • 绑定情况下:onCreate()->onBind()->onUnbind()->onDestroy()

    2.3 Service启动方法:

    2.3.1. 非绑定
    当系统调用`Context.startService(Intent)`来启动Serice时,Service会执行生命周期方法`onCreate()`->`onStartCommand()`,这时系统中就会有该Service的实例,如果系统中存在该Serivce实例时,再调用`Context.startService()`,只会执行`onStartCommand()`方法,而不会执行`onCreate()`方法;Service启动后,就会一直运行于后台,直到调用`Context.stopService()`或`stopSelf()`方法,才会调用`onDestroy()`方法销毁Service实例;而且Service还可以根据`onStartCommand()`方法的返回值来决定这个Serivice的运行模式:
    
    • START_STICKY,如果这个Service在执行完onStartCommand()方法后,被系统杀掉,保留这个Service为开始状态,但不保留Intent对象,因此如果后面没有新的Intent对象传进来,则系统会用null的Intent对象来,调用onStartCommand()方法重新创建该Service实例;
    • START_NOT_STICKY如果这个Serice在执行完onStartCommand()方法后,被系统杀掉,那么这个Service实例不会立刻重新创建,直到有接收到新的Context.startService(Intent),会根据新的Intent来重新创建Service的实例(如果Intent为空,则不会创建);如在做网络相关的工作时;
    • START_REDELIVER_INTENT,如果这个Service在执行完onStartCommand()方法后,被杀掉,则系统会用最后传给Service的Intent对象来执行onStartCommand()方法创建这个Service实例,适用于立即恢复正在进行的工作,如下载;
    2.3.2. 绑定,
    当系统调用`Context.bindService()`来启动Service时,Service会执行生命周期方法`onCreate`->`onBind()`,执行完后,就将调用者与这个Service实例绑定在一起了,当调用者退出或者调用者主动调用`unbindService()`来主动停止Service后,Service实例也会自动调用`onUnbind()`->`onDestory()`退出;
    
    需要注意的是,当用`Context.startService(Intent)`来启动Serivice后,如果再调用Context.bindService()后,这个Serivice实例在被销毁时,需要调用unbindService()后,这个实例都会被销毁;
    

    2.4 IntentService

    IntentService是Service用来处理异步请求的一个子类,在Service里的操作默认是运行在主线程中的,而IntentService会重新生成一个工作线程,来处理需要Service处理的操作,这个操作并不会影响UI主线程正常工作。需要的时候,通过startService(intent)来启动一个IntentService,当IntentService的工作线程里的所有Intent都被处理完后,这个IntentService会自动停止运行。
    
    我们可以新写一个类继承自IntentService,然后复写onHandleIntent(Intent)方法,就可以在程序里使用这个IntentService来处理Intents。处理的时候,每次都从工作线程里取出一个Intent对象让IntentService对象处理,直到工作线程为空时,这个IntentService对象就会销毁;
    

    2.5 如何保证Service杀不死?

    • 充分利用onStartCommand()方法的返回值;
    • 在Service的onDestory中重启该Service;
    • 动态注册一个广播,在广播里重启该Service;

    3 BroadcastReceiver

    `BroadcastReceiver`是用来接收处理通过广播发送的`Intent`对象的组件。`BroadcastReceiver`也是没有界面的,但它可以启动一个Activity来响应他们接收到的信息,或者用`NotificationManager`来通知用户。如果你不用在应用间发送广播,则应该与`LocalBroadcastManager`结合使用,这样保证更高效和更安全。
    

    3.1 BroadcastReceiver的使用:

    我们可以通过`Context.registerReceiver()`方法来动态注册一个`BroadcastReceiver`,也可以在配置文件里,静态注册一个广播;
    

    3.2 广播的种类:

    广播又可以分为无序广播和有序广播:

    • 无序广播,通过Context.sendBroadcast()方法发送的广播,所有这个广播的BrocastReceiver都是在无序的情况下接收这个广播,几乎可以在同一时间收到这个广播,更有效率,但意味着``BrocastReceiver`在收到这个广播后,也不能中止这个广播的传递;
    • 有序广播,通过Context.sendOrderedBroadcast ()方法发送的广播,它一次只会传递给一个BrocastReceiver,由于每个BrocastReceiver是依次执行的,因此前面的BrocastReceiver可以将结果传递给下一个BrocastReceiver,或者中断广播的继续执行。我们可以通过设置android:priority来设置BrocastReceiver的优先级,如果没有设置优先级,默认是按照注册的顺序进行广播。

    4 ContentProvider

    ContentProvider是Android应用程序的重要组成部分,用来为应用程序提供内容,如果你需要在应用程序间共享一些数据,那么就应该使用ContentProvider,如果不用在应用程序间共享数据,则直接使用SQLiteDatabase来存储数据。我们需要了解的方法有:
    
    方法名 方法描述
    onCreate() 初始化一个provider,只能在应用主线程中调用
    query(Uri, String[], String, String[], String) 为调用者返回需要的内容,可以在任意一个线程中调用
    update(Uri, ContentValues, String, String[]) 更新已经存在provider中的内容
    delete(Uri, String, String[]) 从provider中删除数据
    getType(Uri) 得到在provider中的内容的MIME TYPE

    其中Uri是每个ContentProvider的标识;

  • 相关阅读:
    LINQ 详解
    oracle下查询的sql已经超出IIS响应时间
    IOC应用之 Ninject
    JSONP ---------跨域
    国内各大互联网公司相关技术站点2.0版 (集合腾讯、阿里、百度、搜狐、新浪、360等共49个)
    IO多路复用,以socket为例
    socket机制下实现的多用户与服务器交互
    在一个进程中定义多个线程
    基于tcp的socketserver,即tcp的多线程
    基于upd的socketserver,即udp的多线程
  • 原文地址:https://www.cnblogs.com/WoodJim/p/4732776.html
Copyright © 2011-2022 走看看