通读《疯狂Android讲义》笔记 01___Android基础篇

版权声明:此文为本博主原创文章,转载请您必须注明出处,谢谢!原创博主:http://blog.csdn.net/sun_promise https://blog.csdn.net/Sun_2134/article/details/78453872

文 | 莫若吻


注:
1.本文内容参考 李刚的《疯狂Android讲义》一书。
2.此书适合有一定Java基础、初学Android的同学阅读与学习。我最近想巩固下Android基础知识就来拜读一下此书。
3.本文笔记侧重于知识梳理,不侧重于讲解,如果有同学遇到不懂的知识点可以给我留言或者买书自行学习。
4.如果你最近想参加面试,可以参考此文复习哦!

一.第一章 Android应用

1.Android平台架构及特性

Android系统的底层建立在Linux系统之上,Android平台由操作系统、中间件、用户界面和应用软件四层组成,采用一种被称为软件叠层(Software Stack)的方式进行构建。
这种软件叠层结构使层与层之间相互分离,明确各层的分工。这种分工保证了层与层之间的低耦合。当下层的层内或层下发生改变时,上层应用程序无须任何改变。

2.Android系统组成

Android系统主要由应用程序层、应用程序框架、函数库、Android运行时Linux内核等5部分组成。
1)开发Android应用程序(即Android APP)是面向底层的应用程序框架进行的。
2)Android运行时由Android核心库集和**Dalvik虚拟机**2部分组成。每一个Android应用程序都运行在一个单独的Dalvik虚拟机内。
3)Dalvik虚拟机依赖于Linux内核提供的核心功能。
4)Linux内核提供了安全性、内存管理、进程管理、网路协议栈和驱动模型等核心系统服务。

3.Dalvik虚拟机与JVM的区别

  • Dalvik虚拟机并不遵守JVM(Java Virtual Machine)的规范,两者并不兼容。
  • JVM运行的是Java字节码(一般是.class文件);
    Dalvik运行的是专有的dex文件(Dalvik Executable)。
  • JVM直接从.class文件或JAR包中加载字节码后运行;
    Dalvik则需要通过DX工具将应用程序的所有. class文件译成.dex文件,Dalvik则运行.dex文件。
  • Dalvik虚拟机非常适合在移动端上使用;相对于PC或服务器上运行的虚拟机,Dalvik不需要很快的CPU计算速度和大量的内存空间。
  • JVM都是基于栈的,而Dalvik则是基于寄存器的。

4.Dalvik虚拟机的特点

  • 运行专有的.dex文件。
    专有的.dex文件减少了.class文件中的冗余信息,而且会将所有的.class文件整合到一个文件中,从而提高运行性能,而且DX工具还会对.dex文件进行一些性能优化。
  • 基于寄存器实现。
    大部分虚拟机包括JVM都是基于栈的,而Dalvik则是基于寄存器的。一般基于寄存器的虚拟机具有更好的表现,但在硬件通用性上略差。

5.AndroidManifest.xml清单文件

包括信息:
- 应用程序的包名,该包名将作为应用的唯一标识。
- 应用程序所包含的组件,eg:Activity、Service、BroadcastReceiver、ContentProvider等。
- 应用程序兼容的最低版本
- 应用程序使用系统所需的权限声明
- 其他程序访问该程序所需的权限声明。
eg:

<?xml version="1.0" encoding="utf-8"?>
<!--指定Android应用包名:package -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.promise.sun">
 <!--应用权限声明 -->
 <uses-permission android:name="android.permission.VIBRATE" />
 <!--指定Android应用的标签和图标:label、icon -->
 <application
        android:name=".SunApplication"
        android:allowBackup="false"
        android:hardwareAccelerated="true"
        android:icon="@drawable/ic_launcher"
        android:label="${APP_NAME}"
        android:theme="@style/AppTheme"
        android:largeHeap="true"
        tools:replace="android:allowBackup,android:label,android:theme">
        <!--定义Android的一个组件:activity -->
        <activity
            android:name=".app.activity.WelcomeActivity"
            android:screenOrientation="portrait"
            android:theme="@style/StartAppTheme">
            <intent-filter>
                <!--指定此activity为应用程序入口 -->
                <action android:name="android.intent.action.MAIN" />
                <!--加载该应用程序时运行此activity -->
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--定义Android的一个组件:service -->
        <service android:name=".app.ApkUpdateService" />
 </application>
</manifest>

6.Android组件简介

1)Activity和View

Activity是Android的四大组件之一。
Activity是Android中负责与用户交互的组件,只能通过setContentView(view);来显示指定组件。
View组件是所有UI控件、容器控件的基类,但view组件需要放到容器组件中或者使用Activity将其显示出来。
Note:ViewGroup是View的子类。

2)Service

Service是Android的四大组件之一。拥有独立的生命周期。
Service作用:一般用于为其他组件提供后台服务和监控其他组件的运行状态。
Service与Avtivity的区别在于:Service通常位于后台运行,一般不需与用户交互,因此Service没有图形用户界面。

3)BroadcastReceiver

BroadcastReceiver是Android的四大组件之一。广播消息接收器,对Android应用中其他组件进行监听。
注册系统级的监听事件有两种方式
- 在Java 代码中通过Context.registReceiver();完成注册广播。
- 在清单文件中使用

4)ContentProvider

ContentProvider是Android的四大组件之一。
ContentProvider为Android应用之间实现实时数据交换。
Note:一般与ContentProvider结合使用的是ContentResolver,一个应用程序使用ContentProvider暴露自己的数据,而另一个应用程序则通过ContentResolver来访问数据。

5)Intent和IntentFilter

严格讲 Intent并不是Android应用组件。它是Android应用内不同组件之间通信的载体。
Note:Activity、Service、BroadcastReceiver三种组件之间的通信都以Intent作为载体,只使用时略有区别。
- 启动一个Activity,使用Context的startActivity(intent);方法。
- 启动一个Service,使用 startService(intent); 或者 bindService(intent,serviceConnection,intFlags);方法。
- 触发一个BroadcastReceiver,使用sendBroadcast(intent); 或者sendStickyBroadcast(intent) 或者;sendOrderedBroadcast(intent,receiverPermission);方法发送广播。

显示Intent和隐式Intent:
显示Intent明确指定需要启动或者触发的组件的类名
隐式Intent只是指定需要启动或者触发的组件应该满足的条件

Note:隐式Intent需要通过IntentFilter实现,被调用组件使用IntentFilter来声明自身所满足的条件。


猜你喜欢

转载自blog.csdn.net/Sun_2134/article/details/78453872