Activity:
是Android应用层开发的四大组件之一,主要负责和用户交互部分,有自己的生命周期,在其上可以布置按钮,文本框等各种控件,简单来说就是Android的UI部分,承担了View的容器和控制器的功能
生命周期:
onCreate()在Activity第一次被创建的时候被调用
onDestroy()在Activity销毁前调用
onStart()在Activity正要变得为用户所见时被调用
onStop()当Activity不再为用户可见时调用此方法
onResume()在Activity开始与用户进行交互之前被调用
onPasue()当系统将要启动另一个 Activity时调用
onRestart()在Activity停止后,在再次启动之前被调用
activity还有两个方法 onPostResume() 和 OnPostCreate()这两个生命周期的方法,不过开发的时候没有用到过.
Acitivity三种状态:
1、运行:activity在最前端运行;
2、停止:activity不可见,完全被覆盖;
3、暂停:activity可见,但前端还有其他activity,注意:在当前Activitiiy弹出的对话框是Activity的一部分,弹出时,不会执行onPause方法;
Activity启动模式:
standard | 默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。 |
singleTop | 可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。 |
singleTask
| 只有一个实例。在同一个应用程序中启动它的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。 如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。 |
singleInstance | 只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。 |
配置样例:
<activity android:name="com.example.mobilesafe.WatchDogActivity" android:launchMode="singleInstance"/> |
Activity启动方法:
在一个Activity中调用startActivity(intent)方法,直接启动Activity,不带请求码。
在一个Activity中调用startActivityForResult(intent,requestCode)方法,带请求码启动Activity。
onActivityResult(int requestCode, int resultCode, Intent data)
BroadcastReceiver:
就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。
应用场景
1. 当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;
2. 当锁屏或者点亮屏幕时就会产生一条广播,接收这条广播就可以实现一些暂停或者开启一些耗电进程的功能。
3. 当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;
4. 当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度;
注册
静态注册:静态注册是在AndroidManifest.xml文件中配置的。
动态注册:动态注册需要在代码中动态的指定广播地址并注册。
生命周期
1. 广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁
2. 广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框anr
3. 最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉
4. 耗时的较长的工作最好放在服务中完成
有序广播终止了,resultRecevier还可以拿到数据
无序广播没有顺序,不可修改,不可以拦截
Service
服务是看不到界面的,,就是一个没有界面的Activity, 并且长期在后台运行的一个组件.。
为什么用服务?
进程优先级, 回收时是从5~1, 从低到高Foreground process 前台进程
Visible process 可视进程
Service process 服务进程
Background process 后台进程
Empty process 空进程
回收的优先级: 先回收空进程, 一个一个回收的, 当内存够用时, 不再回收空进程. 如果空进程回收完毕后, 内存还是不够用时, 继续向上一个一个的回收后台进程. 依次类推.
当系统内存不够用时, 需要回收服务进程时, 当系统内存又够用时, 会重新启动服务. 当用户去手动的把服务关闭时, 服务不会再重启了
启动方式:
直接启动:Activity开启完服务后就不管服务了. Activity和服务没有关系. startService开启的服务, 只有stopService可以关闭
绑定启动:可以在activity中调用service中的方法.
Service的作用
由于ANR对Activity和BroadcastReceiver响应时间的限制(Activity对事件响应不超过5秒,BroadcastReceiver执行不超过10秒),使得在其中都不适合执行较耗时操作,这样像网络、数据库、复杂计算这类耗时操作的执行就需要一个组件来承担。Service作为Android四大组件之一,其功能之一就是耗时操作的执行,主要功能如下:
a. 执行需要长时间运行的操作,这个操作不与用户进行交互,如网络下载、大文件I/O、复杂计算、监听手机状态。
b. 应用内或应用间数据通信
ContentProvider
数据库在Android当中是私有的,意味着只有由创建数据库的进程可访问它。
一个Content Provider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。也就是说,一个程序可以通过实现一个Content Provider的抽象接口将自己的数据暴露出去。外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当中通过getContentResolver()可以得到当前应用的 ContentResolver实例。
ContentResolver提供的接口和ContentProvider中需要实现的接口对应,主要有以下几个。
Ø Query insert update delete
Intent 的应用: