Android四大组件

Activity与Fragment

  1. Android应用的多个Activity组成Activity栈,当前活动的Activity位于栈顶;
  2. Activity类间接或直街地继承了Context、ContextWrapper、ContextThemeWrapper类等基类;
  3. Android应用要求所有应用组件(activity、Service、ContentProvider、BroadcastReceiver)都必须显式进行配置;
  4. Activity的加载模式:standard(标准模式,默认的)、singleTop(Task顶单例模式)、singleTask(Task内单例模式)、singleInstance(全局单例模式)
  5. Activity一共有以下四种launchMode:standard、singleTop、singleTask、singleInstance;
    1)standard模式:每次通过这种模式来启动目标Activity时,Android总会为目标Activity创建一个新的实例,并将该Activity添加到当前Task栈中——这种模式不会启动新的Task,新Activity将被添加到原有的Task中;
    2)singleTop模式:这种模式与standard模式基本相似,但有一点不同:当将要被启动的目标Activity已经位于Task栈顶时,系统不会重新创建目标Activity的实例,而是直接复用已有的Activity实例;
    3)singleTask模式:采用这种加载模式的Activity在同一个Task内只有一个实例,当系统采用singleTask模式启动目标Activity时,可分为三种情况
        i、如果将要启动的目标Activity不存在,系统将会创建目标Activity的实例,并将它加入Task栈顶;
        ii、如果将要启动的目标Activity已经位于栈顶Task栈顶,此时与singleTop模式的行为相同;
        iii、如果将要启动的目标Activity已经存在、但没有位于Task栈顶,系统将会把位于该Activity上面的所有Activity移出Task栈,从而使得目标Activity转入栈顶;
    4)singleInstance模式:这种加载模式下,系统保证无论从哪个Task冢启动目标Activity,只会创建一个目标Activity实例,并会使用一个全新的Task栈来装载该Activity实例;
  6. finish()结束当前Activity;
  7. Activity的四个状态
    活动状态:当前Activity位于前台,用户可见,可以获得焦点;
    暂停状态:其它Activity位于前台,该Activity依然可见,只是不能获得焦点;
    停止状态:该Activity不可见,失去焦点;
    销毁状态:该Activity结束,或Activity所在的Dalvik进程结束。
  8. Activity的生命周期中,如下方法会被系统回调:
    onCreate(Bundle savedStatus):创建Activity时被回调。该方法只会被调用一次。
    onStart():启动Activity时被回调;
    onRestart():重新启动Activity时被回调;
    onResume():恢复Activity时被回调,onStart()方法后一定会回调onResume()方法;
    onPause():暂停Activity时被回调;
    onStop():停止Activity时被回调;
    onDestroy():销毁Activity时被回调。该方法只会被调用一次;
  9. Android采用Task来管理多个Activity,当我们启动一个应用时,Android就会为之创建一个Task,然后启动这个应用的入口Activity;
  10. 我们可以把Task理解成Activity栈,Task以栈的形式来管理Activity:先启动的Activity被放在Task栈底,后启动的Activity被放在Task栈顶;
  11. Fragment代表了Activity的子模块,因此可以把Fragment理解成Activity片段;
  12. Fragment的生命周期会受它所在的Activity的生命周期的控制;
  13. Fragment总是作为Activity界面的组成部分;
  14. 在Activity运行过程中,可调用FragmentManager的add()、remove()、replace()方法动态地添加、删除或替换Fragment;
  15. 一个Activity可以同时组合多个Fragment;反过来,一个Fragment也可以被多个Activity复用;
  16. Fragment的四个状态:
    活动状态:当前Fragment位于前台,用户可见,可以获得焦点;
    暂停状态:其它Fragment位于前台,该Fragment依然可见,只是不能获得焦点;
    停止状态:该Fragment不可见,失去焦点;
    销毁状态:该Fragment被完全删除,或该Fragment所在的Activity被结束;
  17. Fragment生命周期:
    onAttach():当该Fragment被添加到Activity时被回调。该方法只会调用一次;
    onCreate(Bundle saveStatus):创建Fragment时被回调。该方法只会被调用一次。
    onCreateView():每次创建、绘制该Fragment的View组件时回调该方法,Fragment将会显示该方法返回的View组件;
    onActivityCreated():当Fragment所在的Activity被启动完成后回调该方法;
    onStart():启动Fragment时被回调;
    onResume():恢复Fragment时被回调,onStart()方法后一定会回调onResume()方法;
    onPause():暂停Fragment时被回调;
    onStop():停止Fragment时被回调;
    onDestroyView():销毁该Fragment所包含的View组件时调用;
    onDestroy():销毁Fragment时被回调。该方法只会被调用一次;
    onDetach():将该Fragment从Activity中被删除、被替换完成时回调该方法,onDestroy()方法后一定会回调onDetach()方法。该方法只会被调用一次;

Intent和IntentFilter

  1. Intent封装Android应用程序需要启动某个组件的“意图”。Intent还是应用程序组件之间通信的重要媒介。两个Activity可以把需要交换的数据封装成Bundle对象,然后使用Intent来携带Bundle对象,这样就实现了两个Activity之间的数据交换;
  2. Intent对象大致包含Component、Action、Category、Data、Type、Extra和Flag这7种属性,其中Component用于明确指定需要启动的目标组件,而Extra则用于“携带”需要交换的数据;
  3. Intent的Component属性需要接受一个ComponentName对象;
  4. Android应用的Context代表了访问该应用环境信息的接口,而Android应用的包名则作为应用的唯一标识,因此Android应用的Context对象与该应用的包名有一一对应的关系;
  5. Component属性:
    ComponentName camp=new ComponentName(ComponentAtrr.this,SecondActivity.class);
    Intent intent=new Intent();
    intent.setComponent(camp);
    startActivity(intent);
  6. Intent的Action、Category属性都是一个普通的字符创,其中Action代表该Intent所要完成的一个抽象的“动作”,而Category则用于为Action增加额外的附加类别信息。通常Action属性会与Category属性结合使用;
  7. 元素里的子元素里包含多个子元素(相当于指定了多个字符串)时,就表明该Activity能响应Action属性值为其中任意一个字符串的Intent;
  8. 每个Intent只能指定一个Action“要求”,程序可调用Intent的setAction(String str)方法来设置Action属性值;
  9. 但可以指定多个Category要求,程序可调用Intent的addCategory(String str)方法来为Intent添加Category属性;
  10. IntentFilter则用于声明该组件能满足的要求,每个组件可以声明自己满足多个Action要求、可满足多个Category要求。只要某个组件能满足的要求大于、等于Intent所指定的要求,那么该Intent就能够启动该组件;
  11. Intent默认启动Category属性值为Intent.CATEGORY_DEFAULT常量的组件;
  12. Data属性通常用于向Action属性提供操作的数据。Data属性接收一个Uri对象;
  13. Type属性用于指定该Data所指定Uri对应的MIME类型,这种MIME类型可以是任何自定义的MIME类型,只要符合abc/xyz格式的字符串即可;
  14. Intent的Extra属性通常用于在多个Action之间进行数据交换,Intent的Extra属性值应该是一个Bundle对象;
  15. Intent的Flag属性用于为该Intent添加一些额外的控制旗标,Intent可调用addFlags()方法来为Intent添加控制旗标;

Service与BroadcastReceiver

  1. Service一直在后台运行,它没有用户界面
  2. 开发Service的两个步骤:
    定义一个继承Service的子类;
    在AndroidManifest.xml文件中配置该Service
  3. Service的生命周期:
    IBinder onBind(Intent intent):该方法是Service子类必须实现的方法。该方法返回一个IBinder对象,应用程序可通过该对象与Service组件通信;
    void onCreate():当该Service第一次被创建后立即回调该方法;
    void onDestroy():当该Service被关闭之前将会回调该方法;
    void onStartCommand(Intent intent,int flags,int startId):该方法的早期版本是void onStart(Intent intent,int startId),每次客户端调用startService(Intent)方法启动该Service时都会回调该方法;
    boolean onUnbind(Intent intent):当该Service上绑定的所有客户端都断开连接时将会回调该方法。
  4. 每当Service被创建时会回调onCreate()方法,每次Service被启动时都会回调onStart方法——多次启动一个已有的Service组件将不会回调onCreate方法,但每次启动时都会回调onStartCommand()方法;
  5. 如果Service和访问者之间需要进行方法调用或数据交换,则应用使用bindService()和unbindService()方法启动、关闭Service;
  6. Service本身存在的两个问题:
    Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中;
    Service也不是专门一条新的线程,因此不应该在Service中直接处理耗时的任务;
  7. IntentService是Service的子类,IntentService会创建单独的worker线程来处理onHandleIntent()方法实现的代码,因此开发者无须处理多线程问题;
  8. AIDL的语法:
    AIDL定义接口的源代码必须以.aidl结尾,除了基本类型、String、List、Map、CharSequence之外,其他类型全部需要导包,即使它们在同一个包中也需要导包;
  9. 开发人员定义的AIDL接口只是定义了进程之间的通信接口;
  10. AIDL接口定义了两个进程之间的通信接口,因此不仅服务器端需要AIDL接口,客户端同样需要服务器端定义的AIDL接口,因此开发客户端的第一步就是将Service端的AIDL接口文件复制到客户端应用中,复制到客户端后ADT工具会为AIDL接口生成相应的实现;
  11. Android要求调用远程Service的参数和返回值都必须实现Parcelable接口;
  12. BroadcastReceiver组件本质上就是一种全局的监听器,用于监听系统全局的广播消息;
  13. 每次系统Broadcast事件发生后,系统就会创建对应的BroadcastReceiver的实例,并自动触发它的onReceive()方法,onReceive()方法执行完后,BroadcastReceiver的实例就会被销毁;
  14. 如果BroadcastReceiver的onReceive()方法不能在10秒内执行完成,Android会认为该程序无响应。所以不要在BroadcastReceiver的onReceive()方法里执行一些耗时的操作,否则会弹出ANR的对话框;
  15. Normal Broadcast是完全异步的,可以在同一时刻被所有接受者接收到,消息传递的效率比较高。但缺点是接收者不能将处理结果传给下一个接收者,并且无法终止Broadcast Intent的传播;
  16. Ordered Broadcast的接收者将按预先声明的优先级依次接收Broadcast。优先级别声明在元素的android:priority属性中,数越大优先级越高,取值范围为-1000~1000;
  17. 系统会根据接收者声明的优先级别按顺序逐个执行接收者,优先接收到Broadcast的接收者可以终止Broadcast,调用BroadcastReceiver的abortBroadcast()方法即可终止Broadcast。如果Broadcast被前面的接收者终止,后面的接收者就再也无法获取到Broadcast。
  18. 优先接收到Broadcast的接收者可以通过setResultExtraxs(Bundle)方法将处理结果存入Broadcast中,然后传给下一个接收者,下一个接收者通过代码:Bundle bundle=getResultExtras(true)可以获取上一个接收者存入的数据;
  19. 建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下:
    (1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。 
    (2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java)。 
    (3)建立一个服务类(Service的子类)。
    (4)实现由aidl文件生成的Java接口。
    (5)在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。

ContentProvider实现数据共享

  1. 为了在应用程序之间交换数据,Android提供了ContentProvider,它是不同应用程序之间进行数据交换的标准API,当一个应用程序需要把自己的数据暴露给其他程序使用时,该应用程序就可以通过提供ContentProvider来实现;其他应用程序就可通过ContentResolver来操作ContentProvider暴露的数据;
  2. 开发一个ContentProvider:
    定义自己的ContentProvider类,该类需要继承Android提供的ContentProvider基类;
    在AndroidManifest.xml文件中注册这个ContentProvider,就像Activity一样。注册ContentProvider时需要为它绑定一个Uri;
  3. Uri是ContentProvider和ContentResolver进行数据交换的标识;
  4. 当其他应用通过ContentResolver调用query()、insert()、update()和delete()方法执行数据访问时,实际上就是调用指定Uri对应的ContentProvider的query()、insert()、update()和delete()方法。
  5. Android应用要求所有应用程序组件(Activity、Service、ContentProvider、BroadcastReceiver)都必须显式进行配置;
  6. 配置ContentProvider时通常指定如下属性:
    name:指定该ContentProvider的实现类的类名;
    authorities:指定该ContentProvider对应的Uri(相当于为该ContentProvider分配一个域名);
    android:exported:指定该ContentProvider是否允许其他应用调用。如果将该属性设为false,那么该ContentProvider将不允许其他应用调用;

Hander消息传递机制
  1. 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题;
  2. 只允许UI线程修改Activity里的UI组件;
  3. 主线程主要负责处理与UI相关的事件,如用户按键事件、用户接触屏幕的事件及屏幕绘图事件;
  4. Android的消息传递机制是另一种形式的“事件处理”,这种机制主要是为了解决Android应用的多线程安全问题——Android平台只允许UI线程修改Activity里的UI组件;
  5. Handler类的主要作用有两个:
    在新启动的线程中发送消息;
    在主线程中获取、处理消息;
  6. Message:Handler接收和处理的消息对象;
  7. Looper:每个线程只能拥有一个Looper。它的loop方法负责读取MessageQueue中的消息,读到消息之后就把消息交给发送该消息的Handler进行处理;
  8. MessageQueue:消息队列,它采用先进先出的方式来管理Message。程序创建Looper对象时会在它的构造器中创建Looper对象。Looper提供的构造器源代码如下:
    private Looper(){
           mQueue=new MessageQueue();
           mRun=true;
           mThread=Thread.currentThread();
    }
  9. 只要在UI线程中执行需要消耗大量时间的操作,都会引发ANR,因为这会导致Android应用程序无法响应输入事件和Broadcast;
  10. 在线程中使用Handler的步骤如下:
    调用Looper的prepare()方法为当前线程创建Looper对象,创建Looper对象时,它的构造器会创建与之配套的MessageQueue。
    有了Looper之后,创建Handler子类的实例,重写handleMessage()方法,该方法负责处理来自于其他线程的消息;
    调用Looper的loop()方法启动Looper;
  11. 异步任务AsyncTask是抽象类,它定义了如下三种泛型类型:
    Params:启动任务执行的输入参数的类型;
    Progress:后台任务完成的进度值的类型;
    Result:后台执行任务完成后返回结果的类型;
  12. 使用异步任务的步骤:
    1)创建AsyncTask的子类,并为三个泛型参数指定类型,如果某个泛型参数不需要指定类型,可将她指定为Void;
    2)根据需要,实现As也能穿Task的如下方法。
    • doInBackground(Params...):重写该方法就是后台线程将要完成的任务。该方法可以调用publishProgress(Progress...values)更新任务的执行进度;
    • onProgressUpdate(Progress...values):在doInBackground()方法中调用调用publishProgress()方法更新任务的执行进度后,将会触发该方法;
    • onPreExecute():该方法将在执行后台耗时操作前被调用。通常该方法用于完成一些初始化的准备工作,比如在界面上显示进度条等。
    • onPostExecute(Result result):当DoInBackground()完成后,系统会自动调用onPostExecute()方法,并将DoInBackground方法的返回值传给该方法。
  13. 使用AsyncTask时必须遵守如下规则
    1.必须在UI线程中创建ASyncTask的实例;
    2.必须在UI线程中调用AsyncTask的execute()方法;
    3.AsyncTask的onPreExecute()、onPostExecute(Result result)、doInBackground(Params...)、onProgressUpdate(Progress...values)、方法,不应该由程序员代码调用,而是由Android系统负责调用;
    4.每个AsyncTask只能被执行一次,多次调用将会引发异常;
    
Android网络应用
  1. TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路。
  2. IP协议保证计算机能发送和接收分组数据。IP协议负责将消息从一个主机传送到另一个主机,消息在传送的过程中被分割成一个个小包;
  3. 当一台计算机需要与另一台远程计算机连接时,TCP协议会让它们建立一个连接:用于发送和接收数据的虚拟链路;
  4. TCP协议负责收集这些包,并将其按适当的次序放好传送,在接收端收到后再将其正确地还原。TCP协议保证了数据包在传送中准确无误。
  5. TCP协议的重发机制:当一个通信实体发送一个消息给另一个通信实体后,需要收到另一个通信实体的确认信息,如果没有收到另一个通信实体的确认信息,则会再次重发刚才发送的信息;
  6. Java中能接收其他通信实体连接请求的类是ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待状态;
  7. Socket accept():如果接收到一个客户端Socket的连接请求,该方法将返回一个与客户端Socket对应的Socket;否则该方法将一直处于等待状态,线程也被阻塞;
  8. 客户端通畅可使用Socket的构造器来连接到指定服务器;
  9. Socket提供InputStream getInputStream()和OutputStream getOutputStream()来获取输入流和输出流;
  10. 新版Android平台不允许直接在UI线程建立网络连接、访问网络资源。
  11. 设置Socket连接超时:
    //创建一个无连接的Socket
    Socket s=new Socket();
    //让该Socket连接到服务器,如果经过10秒还没有连接到,则认为连接超时
    s.connect(new InetAddress(host,port),10000);
  12. URL可以由协议名、主机、端口和资源组成;
  13. InputStream openStream():打开与此URL的连接,并返回一个用于读取该URL资源的InputStream;
  14. URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和URL之间的通信连接。
  15. HttpURLConnection继承了URLConnection,用于操作HTTP资源;
  16. 使用URL读取网络资源:
    URL url=new URL(urlname);
    InputStream is=url.openStream();
  17. 使用URLConnection提交请求:
    1)通过URL对象openConnection方法来创建URLConnection对象
    2)设置URLConnection的参数和普通请求属性
    3)如果只是发送GET方式请求,使用connect方法建立和远程资源之间的实际连接即可;如果需要发送POST方式的请求,需要获取URLConnection实例对应的输出流来发送请求参数
    4)远程资源变为可用,程序可以访问远程资源的头字段,或通过输入流读取远程资源的数据;
  18. 实现多线程下载步骤:
    1)创建URL对象
    2)获取指定URL对象所指向资源的大小(由getContentLength()方法实现),此处用到了HttpURLConnection类;
    3)在本地磁盘上创建一个与网络资源相同大小的空文件;
    4)计算每条线程应该下载网络资源的哪个部分(从哪个字节开始,到哪个字节结束)
    5)依次创建、启动多条线程来下载网络资源的指定部分
  19. HttpClient可以维护与服务器之间的Session连接;
  20. Web Service平台主要涉及的技术有SOAP(Simple Object Access Protocol,简单对象访问协议),WSDL(Web Service Description Language,Web Service描述语言),UDDI(Universal Description,Description and Integration,统一描述、发现和整合协议)。
  21. SOAP(简单对象访问协议):是一种具有扩展性的XML消息协议。SOAP允许一个应用程序向另一个应用程序发送XML消息,SOAP消息是从SOAP发送者传送至SOAP接收者的单路消息,任何应用程序均可作为发送者或接收者。SOAP仅定义消息结构和消息处理的协议,与底层的传输协议独立。因此SOAP协议能通过HTTP,JMS或SMTP协议传输;
  22. SOAP依赖于XML文档构建,一条SOAP消息就是一份特定的XML文档,SOAP消息包含如下三个主要元素:
    必需的根元素,SOAP消息对应的XML文档以该元素作为根元素;
    可选的元素,包含SOAP消息的头信息;
    必需的元素,包含所有的调用和响应消息;
  23. 就目前的SOAP消息的结构来看,根元素的通常只能包含两个子元素,第一个子元素是可选的元素,第二个子元素是必需的元素;
  24. WSDL(Web Service描述语言)使用XML描述Web Service,包括访问和使用Web Service所必需的消息,定义该Web Service的位置、功能及如何通信等描述信息;
  25. UDDI是一套信息注册规范,它具有如下特点:基于Web,分布式;
  26. 使用ksoap2-android调用Web Service操作的步骤:
    1)创建HttpTrasportSE对象,该对象用于调用Web Service操作;
    2)创建SoapSerializationEnvelope对象;
    3)创建SoapObject对象,创建该对象时需要传入所要调用的Web service的命名空间、Web Service方法名;
    4)如果有参数需要传给Web Service服务器端,调用SoapObject对象的addProperty(String name,Object value)方法来设置参数,该方法的name参数指定参数名;value参数指定参数值;
    5)调用SoapSerializationEnvelope的setOutputSoapObject()方法,或者直接对bodyOut属性赋值,将前两步创建的SoapObject对象设置为SoapSerializationEnvelope的传出SOAP消息体;
    6)调用对象的call()方法,并以SoapSerializationEnvelope作为参数调用远程Web Service;
    7)调用完成后,访问SoapSerializationEnvelope对象的bodyIn属性,该属性返回一个SoapObject对象,该对象就代表了Web Service的返回消息。解析该SoapObject对象,即可获取调用Web Service的返回值。




你可能感兴趣的:(2015年求职之路)