Activity
生命周期
onCreate():表示Activity正在被创建,这是Activity生命周期的第一个方法。通常我们程序员要在此函数中做初始化的工作,比如:绑定布局,控件,初始化数据等。
onStart():表示Activity正在被启动,这时候的Activity已经被创建好了,完全过了准备阶段,但是没有出现在前台,需要执行onResume()函数才可以进入到前台与用户进行交互。
onResume():表示Activitiy已经可见了,并且Activity处于运行状态,也就是Activity不止出现在了前台,而且还可以让用户点击,滑动等等操作与它进行交互。
onPause()暂停状态,Activity是去焦点,但仍然可见;Dialog不会调用onPause()和onStop(), 非全屏Activity会调用onPause()不会调用onStop(),全屏Activity 会调用onPause()和onStop()。
onStop(): activity在后台运行且不可见。
onRestart():表示Activity正在重新启动。一般情况下,一个存在于后台不可见的Activity变为可见状态,都会去执行onRestart()函数,然后会继续执行onStart()函数,onResume()函数出现在前台并且处于运行状态。
onDestory():表示Activity要被销毁了。这是Activity生命中的最后一个阶段,我们可以在onDestory()函数中做一些回收工作和资源释放等,比如:广播接收器的注销等。
异常时会执行onSaveInstanceState来保存当前Activity状态。调用onSaveInstanceState的时机总会发生在onStop之前,当Activity被重新创建后,系统会调用onRestoreInstanceState,并且把Actiivty销毁时Bundle对象作为参数传递给onRestoreInstanceState和onCreate方法。onRestoreInstanceState是在onstart方法之前执行,onCreate可能为null,但onRestoreInstanceState一定不为null。
横竖屏切换
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges="orientation|keyboardHidden||screenSize""时
切屏不会重新调用各个生命周期,只会执行
启动模式
standard:默认模式,执行一次不管有没有实例都会创建新的实例。
singleTop:启动活动时如果发现任务栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例,同时它的onNewIntent 方法会被回调,通过此方法的参数我们可以取出当前请求的信息。如果不在栈顶依然会重新创建实例onNewIntent不会触发。多用在推送
singleTask 栈内复用模式:如果 Activity 已存在,则复用 Activity,并清除它上面的 Activity;如果 Activity 不存在,就在对应的 Task 新建一个 Activity 应用首页,会触发onNewIntent回调
singleInstance 单实例模式:和 SingleTask 的行为比较一致,不过限制该 Activity 只能存在一个 Task 中;且该 Task 只能有一个 Activity 提供独立功能,如:闹钟,会触发onNewIntent回调
FLAG_ACTIVITY_SINGLE_TOP:与 singleTop 行为一致
FLAG_ACTIVITY_NEW_TASK:标志对应这singleTask
FLAG_ACTIVITY_CLEAR_TOP:如果目标存在,直接复用,并清除目标以上的活动,否则重建。
FLAG_ACTIVITY_CLEAR_TASK:只能组合使用,FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK,用来清除目前所有的任务,并打开新任务。
activity间通信
Intent/Bundle,静态变量,全局变量,外部存储sharepreference。绑定service重写onServiceConnected.
启动方式
startActivity,startActivityforresult.
清单文件IntentFilter 匹配规则,通过action,category,data三种。
Service
Service(后台服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件。可以用来开发如监控类程序。比如音乐播放器这个activity 会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。同时,系统也将保持这个service 一直执行,直到这个service 运行结束。另外,我们还可以通过使用Context.bindService()方法,连接到一个service 上。当连接到一个service 之后,我们还可以service 提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。Service使用步骤如下: 1.创建一个自定义service继承service类 2.AndroidManifast.xml配置清单文件中3.服务不能自己运行,需要通过Contex.startService()或Contex.bindService()启动服务
通过startService()方法启动的服务于调用者没有关系,即使调用者关闭了,服务仍然运行想停止服务要调用Context.stopService(),此时系统会调用onDestory(),使用此方法启动时,服务首次启动系统先调用服务的onCreate()-->onStart(),如果服务已经启动再次调用只会触发onStartCommand()方法,使用bindService()启动的服务与调用者绑定,只要调用者关闭服务就终止,使用此方法启动时,服务首次启动系统先调用服务的onCreate()-->onBind(),如果服务已经启动再次调用不会再触发这2个方法,调用者退出时系统会调用服务的onUnbind()-->onDestory(),想主动解除绑定可使用Contex.unbindService(),系统依次调用onUnbind()-->onDestory();
1>:Service服务是长期运行在后台;
2>:它不是单独的进程,因为它和应用程序在同一个进程;
3>:也不是单独的线程,它跟线程没有任何关系,所以不能进行耗时操作;
4>:如果直接把耗时操作放在Service中的onStartCommand()中,可能发生ANR,如果有耗时操作,就必须开启一个单独的线程来处理;
为了解决这样的问题,就引入了IntentService;
2. IntentService
1>:启动方式和Service一样,都是startService();
2>:继承于Service,包含Service所有特性,包括生命周期,是处理异步请求的一个类,;
3>:一般自定义一个Service继承Service,然后复写onHandleIntent()方法,在这个方法中初始化这些第三方的,来执行耗时操作;
4>:可以启动多次IntentService,每一个耗时操作以工作队列在onHandleIntent()方法中执行,执行完第一个再去执行第二个,以此类推;
5>:所有的请求都在单线程中,不会阻塞主线程,同一个时间只处理同一个请求;
6>:不需要像在Service中一样,手动开启线程,任务执行完成后不需要手动调用stopSelf()方法来停止服务,系统会自动关闭服务;
1>:一般用于App启动时在BaseApplication中初始化一些第三方的东西,比如腾讯Bugly、腾讯X5WebView、OkhttpUtils等,目的就是为了防止BaseApplication中加载东西过多,导致App启动速度过慢,所以就自定义一个 InitializeService,继承Service,然后重写 onHandleIntent()方法,在这个方法中初始化这些第三方的;
BroadcastReceiver
原理就是用了观察者模式,广播接收者通过binder机制在AMS注册,广播发送者通过binder机制向AMS发送广播,AMS根据发送者要求在注册的列表中找到对应消息放到消息循环队列中,广播接收者通过消息循环拿到广播回调onReceiver()方法。生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报ANR(Application No Response) 程序无响应的错误信息
-静态注册 在AndroidManifest.xml里通过<receive>标签声明,常驻不受任何组件生命周期影响,耗电耗内存
-动态注册 调用Context.registerReceiver(),灵活随着组件生命周期变化
广播类型
普通广播,系统广播,有序广播,粘性广播,APP应用内广播。
Android中的广播可以跨进程甚至跨App直接通信,且注册是exported对于有intent-filter的情况下默认值是true。所以APP可能与其他App都收到intent-filter相匹配的广播造成干扰,可以使用exporte=false使得此APP不接收其他应用广播,还有通过设置包名来对应。
ContentProvider
主要用于不同应用程序直接实现数据共享的功能,提供了一套完整的机制允许一个程序访问另一个程序中的数据而且保证被访问的数据安全性。他实现原理就是binder机制。android中一般使用访问手机系统的数据,比如电话通讯录,日历图片等或者创建自己的contentprovider为其他应用程序提供访问的外部接口。数据主要是集合的形式存在数据库中,contentprovider就是通过 统一资源标识符URI来区分外界要访问的具体数据集合而不用关心数据底层的存储方式。所以URI一般由前缀主题scheme,授权信息authority,表名path三部分组成找到数据对应路径。对于contentprovider的访问必须借助于contentResolve对数据进行增删改查。而且android还提供了辅助contentResolve的三个方法:ContentUris,UriMatcher,contentObserver三种工具栏。ContentUris用来操作URI后面的id,获取或者添加。 UriMatcher是根据URI解析并找到对应的表单数据。contentObserver主要就是观察数据变化并通知外界。
他的创建时机是在 Application ontauch创建之后,在 Application 的 onCreate() 方法之前。生命周期伴随着整个应用进程。
网友评论