学习 Android 开发,首先脑海中要有一个大概的知识体系结构图,而 Android 的四大组件就是其中很重要的一部分。


Android 四大组件
  • Activity
  • Service
  • Content provider
  • Broadcast receiver

接下来看看他们具体都是什么
1. Activity

<1> Activity 相当于 iOS 中的 ViewController;
<2> Activity 的作用是展示用户交互,是一个屏幕界面、窗口;
<3> Activity 之间通过 Intent 跳转、通信;
<4> 每一个 Activity 都必须在 AndroidManifest.xml 配置文件中声明,否则系统将不识别也不执行该 Activity。
<5> 启动 Activity 过程:调用startActivity,该方法通过层层调用,最终会调用 ActivityStackSupervisor.java 中的 startSpecificActivityLocked。

2. Service

<1> service 就是服务,一种计算型组件;
<2> 它的作用是支持需要在后台执行的耗时操作,如下载、复杂的计算等,或者监控其他组件的运行状态;
<3> 特点:生命周期很长、没有用户交互界面、在后台运行等。
<4> 启动:调用 startService ,层层调用后,最终会调用 ActivityService.java 中的 bringUpServiceLocked。
<5> 与 Activity 只有一种运行模式(启动状态)不同,service 组件有两种状态:启动状态(started)绑定状态(bound)

  • 通过调用 startService() 启动服务,这时 service 处于启动状态, 它的内部可以做一些后台计算。尽管 service 组件用于后台耗时操作,但它本身是运行在主线程的,因此单独的耗时操作仍然需要到单独的线程中去执行;处于启动状态时的 service 生命周期与启动它的组件无关,并且可以在后台无限期运行,即使启动它的组件已经被销毁。因此,需要在完成任务后调用 stopSelf() 方法停止服务,或者由启动它的组件调用 stopService() 停止。
  • 通过调用 bindService() 启动service,这时 service 处于 bound 状态,即启动 service的组件销毁,service也跟着销毁。这种状态下,可以很方便的与service 进行通信,通过调用 stopService 、 unBindService 等。
    <6> service 需要在 AndroidManifest.xml 文件中生命,使用
3. Content provider

<1> Content provider 是一种数据共享组件;
<2> 可以通过 ContentResolver 向他组件乃至其他应用共享数据,无法被用户感知;
<3> ContentProvider 使用URI(content:// ...)来唯一标识数据集。

4. Broadcast receiver

<1> 一种消息型组件,类似 iOS 中的通知?
<2> 用于在不同组件乃至不同应用之间传递消息,无法被用户感知;
<3> 静态注册动态注册

  • 静态注册,在 AndroidManifest.xml 中进行注册广播,这种广播在应用安装时会被系统解析,不需要应用启动也可以接收到相应广播
  • 动态注册,需要通过Context.registerReceiver() 来实现,并在不需要的时候通过 Context.unRegisterReceiver() 移除广播。这种广播要应用启动才能注册和接收消息,在实际开发中通过 Context 的一系列 send 方法发送消息,发送方与接收方通过接收者的来实现的。

<4> 特点,动态注册广播的对象销毁后, 广播也就失效。


四大组件的相关总结
  • 四大组件都需要在 AndroidManifest 文件中进行配置才能使用。
  • Android 系统自带的 Content provider :
|——Browser|——CallLog                       |——Contacts|              |——Groups|              |——People|              |——Phones|              |——Photos|——Images|              |——Thumbnails|——MediaStore|              |——Albums|              |——Artiss|              |——Audio|              |——Genres|              |——Playlists|——Settings|——Video
  • Activity 生命周期:


    Activity生命周期
  • Activity 生命周期下的4种状态:
1. 活动状态(Activity/Running):当Activity 处于当前栈顶,此时它焦点能响应用户的操作。同一时刻有且只有一个Activity处于活动状态。2. 暂停状态(Paused):当Activity失去焦点但仍对用户可见(如在它之上有另外一个透明的Activity或Toast、Alert时)时处于暂停状态,它仍然存活,但当系统内存极小时可能会被杀掉。3. 停止状态(Stoped):完全被另一个Activity遮挡时处于停止状态,容易被杀掉4. 非活动状态(Dead):Activity尚未被启动、已经被手动终止或已经被系统回收时处于Dead状态,调用finish()手动终止Activity
  • Activity 生命周期7个重要方法:
/** *  1. 当 Activity 第一次被实例化的时候系统会调用; *     整个生命周期只调用一次; *     通常的初始化设置:为Activity设置所有使用的布局文件;为按钮绑定监听器等静态的设置操作 */protected void onCreate(Bundle savedInstanceState) {    // code ...}/** *  2. 当Activity可见但未获得用户焦点不能交互时系统会调用 */protected void onStart() {    //code ...}/** *  3. 当Activity已经停止然后重新被启动时系统会调用 */protected void onRestart() {    //code ...}/** *  4. 当Activity 可见且获得用户焦点能交互时系统会调用 */protected void onResume() {    //code ...}/** *  5. 当系统启动另一个新的 Activity 时,在新的 Activity 启动之前被系统调用保存现有的Activity中的持久数据、停止动画等 */protected void onPause() {    //code ...}/** *  6. 当Activity 被新的 Activity 完全覆盖不可见时被调用 */protected void onStop() {    //code ...}/** *  7. 当Activity (用户调用finish() 或系统由于内存不足)被系统销毁时调用; *     生命周期内只调一次; *     用来释放onCreate()中创建的资源,如结束线程等 */protected void onDestroy() {    //code ...}
  • 关闭Activity后再回到这个Activity想要保持离开前的样子怎么实现呢?重写onSaveInstanceState()保存Activity被杀之前的状态(前提是用户本不想销毁这个Activity),在onPause()之前被触发,当此Activity再次被实例化时会通过onCreate(Bundle savedInstanceState)将已保存的临时状态数据传入,因为onSaveInstanceState()方法不总是被调用,触发条件为(按下Home键、按下电源键关闭屏幕、横竖屏切换情况下),代码实例如下:
protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  if (null != savedInstanceState) {    String _userID = savedInstanceState.getString("UserID");    String _UID = savedInstanceState.getString("UID");    String _password = savedInstanceState.getString("Password");    updateUserID(_userID);    updateUID(_UID);    updatePassword(_password);  }  setContentView(R.layout.activity.main);}protected void onSaveInstanceState(Bundle outState) {  super.onSaveInstanceState(outState);    outState.putString("UserID", getUserID());  outState.putString("UID", getUID());  outState.putString("Password", getPassword());}
  • BroadcastReceiver 生命周期只有十秒左右,因此如果在onReceive() 中做超过十秒的操作,就会报ANR(Application No Response)程序无响应的错误。

更多相关文章

  1. EventBus源码解析
  2. Android中判断状态栏是否存在
  3. android 中如何获取camera当前状态
  4. 【androd基础】之Android(安卓)返回键的调用
  5. Android(安卓)ApiDemo学习(二)notification——2 Notifying Servic
  6. Android(安卓)AIDl来实现进程间通讯
  7. Android(安卓)Intent 基本使用及对象构成
  8. android动态修改drawable颜色及大小
  9. android 内置的短信等调用代码

随机推荐

  1. [Android] 环境配置之Android(安卓)Studi
  2. Android(安卓)中播放内存中视频
  3. Android(安卓)JNI入门实例
  4. Android(安卓)Tethering can't been open
  5. 【精品教程】Android应用开发入门教程(经
  6. android launcher 资料
  7. CoordinatorLayout+AppBarLayout隐藏标题
  8. Android开发之android命令大全
  9. Android(安卓)studio 中JNI JAVA和C++互
  10. android的触摸屏事件