1、Activity的生命周期:

    Activity大致会经过如下4个状态:

    活动状态:当前Activity位于前台,用户可见,可以获得焦点

    暂停状态:其他Activity位于前台,该Activity依然可见,只是不能获得焦点

    停止状态:该Activity不可见,失去焦点

    销毁状态:该Activity结束,或Activity所在的Dalvik进程被结束。

    在Activity的生命周期中,如下方法会被系统回调:

    onCreate(Bundle savedStatus): 创建Activity时被回调。该方法只会被调用一次

    onStart(): 启动Activity时被回调,。

    onRestart(): 重新启动Activity时被回调。

    onResume(): 恢复Activity时被回调,onStart()方法后一定会回调 onResume() 方法

    onPause(): 暂停Activity时被回调,也就是系统准备启动或恢复另一个活动时调用。

    onStop(): 停止Activity时被回调。

    onDestroy(): 销毁Activity时被调用。该方法只会被调用一次

 

 

    开发Activity时可根据需要选择性地覆盖指定方法:

    覆盖onCreate(Bundle savedStatus)方法:该方法用于对该Activity执行初始化,如加载布局、绑定事件...

    覆盖onPause()方法:可以保存进行状态,保存一些关键数据

    覆盖onResume()方法:恢复保存的状态

2、关于Service:

    开发者开发Service的步骤与开发Activity的步骤很像,开发Service组件需要先开发一个Service的子类,然后在AndroidManifest.xml文件中配置该Service,配置时可通过<intent-filter.../>元素指定它可被哪些Intent启动。

    Service与Activity还有一点相似之处,它们都是从Context派生出来的,因此它们都可调用Context里定义的如getResources()、getContentResolver()等方法。

    Android系统本身提供了大量的Service组件,开发者可通过这些系统Service来操作Android系统本身。

    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上绑定的所有客户端都断开连接时将会回调该方法。

    调用Context里定义的startService()、stopService()方法即可启动、关闭Service。

    每当Service被创建时会回调onCreate方法,每次Service被启动时都会回调onStart方法——多次启动一个已有的Service组件将不会再回调onCreate方法,但每次启动时都会回调onStartCommand()方法。

    如果希望Service组件做某些事情,那么只要在 onCreate() onStartCommand() 方法中定义相关业务代码即可。

    Android系统中运行Service有如下两种方式:

    通过Context的 startService() 方法:通过该方法启用Service,访问者与Service之间没有关联,即使访问者退出了,Service仍然运行,也无法进行通信、数据交换。

    通过Context的 bindService() 方法:使用该方法启用Service,访问者与Service绑定在了一起,访问者一旦退出,Service也就终止,使用unbindService()方法关闭Service,可以进行方法调用数据交换

    bindService(Intent service, ServiceConnection conn, int flags)的三个参数的解释如下:

    service:该参数通过Intent指定要启动的Service

    conn:该参数是一个ServiceConnection对象,该对象用于监听访问者与Service之间的连接情况。当访问者与Service之间连接成功时将回调该ServiceConnection对象的 onServiceConnected(ComponentName name, IBinder service)方法,onBind(Intent intent)方法所返回的非空IBinder对象将会传给service参数,这样访问者就可通过该IBindler与被绑定Service进行的通信;当Service所在的宿主进程由于异常中止或由于其他原因终止,导致该Service与访问者之间断开连接时回调该ServiceConnection对象的onServiceDisconnected(ComponentName name)方法(当调用者主动通过unBindService()方法断开与Service的连接时,ServiceConnection对象的onServiceDisconnected(ComponentName name)方法并不会被调用)

    flags:指定绑定时是否自动创建Service(如果Service还未创建)。该参数可指定为0(不自动创建)或BIND_AUTO_CREATE(自动创建)

    IBinder对象相当于Service组件的内部钩子,该钩子关联到绑定的Service组件,当其他程序组件绑定该Service时,Service将会把IBinder对象返回给其他程序组件,其他程序组件通过该IBinder对象即可与Service组件进行实时通信。

    实际上开发时通常会采用继承Binder(IBinder的实现类)的方式实现自己的IBinder对象。

    Service本身存在的两个问题:

    Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中。

    Service也不是专门一条新的线程,因此不应该在Service中直接处理耗时的任务(如果开发者需要在Service处理耗时任务,可以在BindService中的onCreate()方法中启动一条新线程来处理耗时任务)。

    使用IntentService:

    IntentService正好可以弥补Service存在的两个问题。

    IntentService是Service的子类,因此它不是普通的Service,但是它包含了Service的全部特性,也包含Service的生命周期。

    启动方式同Service,也是通过startService方法。

    Service在onStart中处理intent,并且是在主线程中运行;IntentService会启动工作线程处理intent,并且是逐个处理intent的。

    IntentService会创建单独的worker线程来处理所有的Intent请求。

    IntentService会创建单独的worker线程来处理onHandleIntent()方法实现的代码,因此开发者无须处理多线程问题。

    当所有请求处理完成后,IntentService会自动停止(执行完后会调用onDestroy()方法),因此开发者无须调用stopSelf()方法来停止该Service。

    扩展IntentService实现Service无须重写onBind()、onStartCommand()方法,只要重写onHandleIntent()方法即可

3、Toast的特点:

     Toast提示信息不会获得焦点

     Toast提示信息过一段时间会自动消失

     大部分时候只能显示简单的文本提示

     如果应用需要显示诸如图片、列表之类的复杂提示,此时就需要调用Toast构造器创建实例,再调用setView()方法设置该Toast显示的View组件

     允许开发者自己定义Toast显示的内容

4、Menu:

    当用户单击手机上的"MENU"键时显示的菜单为选项菜单(Option Menu)。

    不再提供MENU键的手机,Android推荐使用ActionBar来代替菜单。

    当用户一直按住某个组件时,该组件所关联的上下文菜单(ContextMenu)会显示出来。

    为Android应用添加菜单或子菜单的步骤如下:

    重写Activity的onCreateOptionsMenu(Menu menu)的方法,在该方法里调用Menu对象的方法来添加菜单项或子菜单。

    如果希望应用程序能响应菜单项的单击事件,重写Activity的onOptionsItemSelected(MenuItem item)方法即可。如果开发者需要针对不同菜单提供相应,就需要在onOptionsItemSelected(MenuItem item)方法中使用switch语句进行判断。由于程序需要在onOptionsItemSelected(MenuItem item)方法中准确判断到底是哪个菜单项被单击了,因此添加菜单项时通常应为每个菜单项指定ID

5、使用ContentProvider实现数据共享:

    ContentProvider需要在AndroidManifest.xml文件中进行配置。

    一旦某个应用程序通过ContentProvider暴露了自己的数据操作接口,那么不管该应用程序是否启动,其他应用程序都可通过该接口来操作该应用程序的内部数据,包括增加数据、删除数据、修改数据、查询数据等。

    其他应用程序通过ContentResolver来操作ContentProvider所暴露的数据,Context提供getContentResolver()方法来获取ContentResolver对象(Activity、Service等组件都可通过该方法获取ContentResolver对象),然后就可调用ContentResolver的insert、delete、update 和 query 四种方法来操作数据。

    一般来说,ContentProvider是单实例模式的,当多个应用程序通过ContentResolver来操作ContentProvider提供的数据时,ContentResolver调用的数据操作将会委托给同一个ContentProvider处理。

    Uri是ContentResolver 和 ContentProvider 进行数据交换的标识

    ContentResolver对指定Uri执行CRUD等数据操作,但Uri并不是真正的数据中心,因此这些CRUD操作会委托给该Uri对应的ContentProvider的CRUD来实现。

    ContentResolver调用方法时参数将会传给该ContentProvider的query()、insert()、update() 和 delete()方法

    ContentReslover调用方法的返回值,也就是ContentProvider执行query()、insert()、update() 和 delete()方法的返回值。 

6、AlertDialog对话框:

    生成的对话框可分为4个区域:图标区、标题区、内容区、按钮区

    AlertDialog的构造方法被声明为protected,所以不能直接使用new关键字来创建AlertDialog类的对象实例,需要使用Builder类,该类是AlertDialog类中定义的一个内嵌类,因此必须创建AlertDialog.Builder类的对象实例。

    首先要创建AlertDialog.Builder对象,再调用AlertDialog.Builder的setTitle()或setCustomTitle()方法设置标题、setIcon()方法设置图标、相关方法设置对话框内容和添加多个按钮,再调用create()方法创建AlertDialog对象,最后调用show()方法将该对话框显示出来

    AlertDialog.Builder的create() 和 show() 方法都返回AlertDialog对象

7、跨进程调用Service(AIDL Service):

    与绑定本地Service不同的是,本地Service的onBind()方法会直接把Ibinder对象本身传给客户端的ServiceConnection的onServiceConnected方法的第二个参数。但远程Service的onBind()方法只是将IBinder对象的代理传给客户端的ServiceConnection的onServiceConnected方法的第二个参数,然后通过该IBinder对象去回调远程Service的属性或方法。

    Android需要AIDL(Android Interface Definition Language安卓接口定义语言)来定义远程接口。

    AIDL的语法与java接口很相似,但存在如下几点差异:

    AIDL定义接口的源代码必须以.aidl结尾

    AIDL接口中用到的数据类型,除了基本类型、String、List、Map、CharSequence之外,其他类型全部都需要导包,即使它们在同一个包中也需要导包