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之外,其他类型全部都需要导包,即使它们在同一个包中也需要导包