android四大组件?
答:(1)activity(活动):
1)一个Activity通常就是一个单独的屏幕(窗口)。
2)Activity之间通过Intent进行通信。(在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据。)
3)android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。
(2)service(服务):Service通常位于后台运行,它一般不需要与用户交互,因此Service组件没有图形用户界面。Service组件需要继承Service基类。Service组件通常用于为其他组件提供后台服务或监控其他组件的运行状态。
1)service用于在后台完成用户指定的操作。service分为两种:
a)started(启动):当应用程序组件(如activity)调用startService()方法启动服务时,服务处于started状态。
b)bound(绑定):当应用程序组件调用bindService()方法绑定到服务时,服务处于bound状态。
2)startService()与bindService()区别:
a)started service(启动服务)是由其他组件调用startService()方法启动的,这导致服务的onStartCommand()方法被调用。当服务是started状态时,其生命周期与启动它的组件无关,并且可以在后台无限期运行,即使启动服务的组件已经被销毁。因此,服务需要在完成任务后调用stopSelf()方法停止,或者由其他组件调用stopService()方法停止。
b)使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
4)Service使用步骤如下
       1>继承service类


       2>AndroidManifast.xml配置清单文件中<application>节点里对服务进行配置


 

<service name=".SMSService"/>



服务不能自己运行,需要通过Contex.startService()或Contex.bindService()启动服务


通过startService()方法启动的服务于调用者没有关系,即使调用者关闭了,服务仍然运行想停止服务要调用Context.stopService(),此时系统会调用onDestory(),使用此方法启动时,服务首次启动系统先调用服务的onCreate()-->onStart(),如果服务已经启动再次调用只会触发onStart()方法


使用bindService()启动的服务与调用者绑定,只要调用者关闭服务就终止,使用此方法启动时,服务首次启动系统先调用服务的onCreate()-->onBind(),如果服务已经启动再次调用不会再触发这2个方法,调用者退出时系统会调用服务的onUnbind()-->onDestory(),想主动解除绑定可使用Contex.unbindService(),系统依次调用onUnbind()-->onDestory();


Content Provide(内容提供者):
答:
(1)android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。
(2)只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式。
(3)ContentProvider实现数据共享。ContentProvider用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为android没有提供所有应用共同访问的公共存储区。
(4)开发人员不会直接使用ContentProvider类的对象,大多数是通过ContentResolver对象实现对ContentProvider的操作。
(5)ContentProvider使用URI来唯一标识其数据集,这里的URI以content://作为前缀,表示该数据由ContentProvider来管理。
BroadcastReceiver(广播接收器):
答:
(1)你的应用可以使用它对外部事件进行过滤,只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力,例如闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
(2)广播接收者的注册有两种方法,分别是程序动态注册和AndroidManifest文件中进行静态注册。
(3)动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用。
Activity的生命周期?
答:
下面的图显示了Activity的重要状态转换,矩形框表明Activity在状态转换之间的回调接口,开发人员可以重载实现以便执行相关代码,带有颜色的椭圆形表明Activity所处的状态。


Activity整个生命周期的4种状态、7个重要方法和3个嵌套循环


1>   四种状态


      活动(Active/Running)状态
当Activity运行在屏幕前台(处于当前任务活动栈的最上面),此时它获取了焦点能响应用户的操作,属于运行状态,同一个时刻只会有一个Activity 处于活动(Active)或运行


(Running)状态


    暂停(Paused)状态
当Activity失去焦点但仍对用户可见(如在它之上有另一个透明的Activity或Toast、AlertDialog等弹出窗口时)它处于暂停状态。暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接),但是当系统内存极小时可以被系统杀掉


3.      停止(Stopped)状态


完全被另一个Activity遮挡时处于停止状态,它仍然保留着所有的状态和成员信息。只是对用户不可见,当其他地方需要内存时它往往被系统杀掉


4.      非活动(Dead)状态


Activity 尚未被启动、已经被手动终止,或已经被系统回收时处于非活动的状态,要手动终止Activity,可以在程序中调用"finish"方法。


如果是(按根据内存不足时的回收规则)被系统回收,可能是因为内存不足了


内存不足时,Dalvak 虚拟机会根据其内存回收规则来回收内存:


      1. 先回收与其他Activity 或Service/Intent Receiver 无关的进程(即优先回收独


立的Activity)因此建议,我们的一些(耗时)后台操作,最好是作成Service的形式


      2.不可见(处于Stopped状态的)Activity


      3.Service进程(除非真的没有内存可用时会被销毁)


      4.非活动的可见的(Paused状态的)Activity


      5.当前正在运行(Active/Running状态的)Activity


 


2>  7个重要方法,当Activity从一种状态进入另一状态时系统会自动调用下面相应的方


法来通知用户这种变化


当Activity第一次被实例化的时候系统会调用,


整个生命周期只调用1次这个方法


通常用于初始化设置: 1、为Activity设置所要使用的布局文件2、为按钮绑定监听器等静态的设置操作

onCreate(Bundle savedInstanceState);



当Activity可见未获得用户焦点不能交互时系统会调用


onStart();



当Activity已经停止然后重新被启动时系统会调用


   

onRestart();



当Activity可见且获得用户焦点能交互时系统会调用


onResume();




当系统启动另外一个新的Activity时,在新Activity启动之前被系统调用保存现有的Activity中的持久数据、停止动画等,这个实现方法必须非常快。当系统而不是用户自己出于回收内存时,关闭了activity 之后。用户会期望当他再次回到这个activity 的时候,它仍保持着上次离开时的样子。此时用到了onSaveInstanceState(),方法onSaveInstanceState()用来保存Activity被杀之前的状态,在onPause()之前被触发,当系统为了节省内存销毁了Activity(用户本不想销毁)时就需要重写这个方法了,当此Activity再次被实例化时会通过onCreate(Bundle savedInstanceState)将已经保存的临时状态数据传入因为onSaveInstanceState()方法不总是被调用,触发条件为(按下HOME键,按下电源按键关闭屏幕,横竖屏切换情况下),你应该仅重写onSaveInstanceState()来记录activity的临时状态,而不是持久的数据。应该使用onPause()来存储持久数据。

onPause();



当Activity被新的Activity完全覆盖不可见时被系统调用

onStop();



当Activity(用户调用finish()或系统由于内存不足)被系统销毁杀掉时系统调用,(整个生命周期只调用1次)用来释放onCreate ()方法中创建的资源,如结束线程等

onDestroy();




      


3>  3个嵌套循环


             1.Activity完整的生命周期:从第一次调用onCreate()开始直到调用onDestroy()结束


             2.Activity的可视生命周期:从调用onStart()到相应的调用onStop()


                    在这两个方法之间,可以保持显示Activity所需要的资源。如在onStart()中注册一个广播接收者监听影响你的UI的改变,在onStop() 中注销。


             3.Activity的前台生命周期:从调用onResume()到相应的调用onPause()。


3个循环详解:


整个的生命周期,从onCreate(Bundle)开始到onDestroy()结束。Activity在onCreate()设置所有的“全局”状态,在onDestory()释放所有的资源。例如:某个Activity有一个在后台运行的线程,用于从网络下载数据,则该Activity可以在onCreate()中创建线程,在onDestory()中停止线程。
可见的生命周期,从onStart()开始到onStop()结束。在这段时间,可以看到Activity在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个接口之间,需要保持显示给用户的UI数据和资源等,例如:可以在onStart中注册一个IntentReceiver来监听数据变化导致UI的变动,当不再需要显示时候,可以在onStop()中注销它。onStart(),onStop()都可以被多次调用,因为Activity随时可以在可见和隐藏之间转换。
前台的生命周期,从onResume()开始到onPause()结束。在这段时间里,该Activity处于所有 Activity的最前面,和用户进行交互。Activity可以经常性地在resumed和paused状态之间切换,例如:当设备准备休眠时,当一个 Activity处理结果被分发时,当一个新的Intent被分发时。所以在这些接口方法中的代码应该属于非常轻量级的。
两种Service用法(startService、bindService),使用场景?
答:在本地服务中,不需要跟组件进行交互服务,通过调用Content.startService();需要跟组件进行交互服务,调用Content.bindService().
BroadcastReceiver收发原理,有几种注册方法(程序注册和menifest文件注册)?
答:
两种,broadcast receiver广播接收者的注册分静态注册(在AndroidManifest文件中的<application>的标签里添加<receiver>标签,并设置要接收的action)和通过代码动态创建并以调用Context.registerReceiver()的方式注册至系统。需要注意的是在AndroidManifest文件中进行配置的广播接收者会随系统的启动而一直处于活跃状态,只要接收到感兴趣的广播就会触发(即使程序未运行)。
Intent显式及隐式,使用方法,工作原理(出发后,系统根据参数找到对应的目标并执行)?
答:
intent最常见的用法是显式(通过指定要装载的类)或隐式(通过请求对一条数据执行某个动作)启动新的Activity。
显式:

Intent intent = new Intent(MyActivity.this,MyotherActivity.class);starActivity(intent);


隐式:

if(somethingWeird  &&  itDontLookGood){ 

 Intent intent = new Intent(Intent .ACTION_DIAL, Uri.parse("tel:555-2368"));startActivity(intent);} 

 }