Android系统分析及应用编程(一)

Android应用开发有一段时间了,做系统层面的却还是属于新手,一直想写点自己的东西,也不知道我定的这个系列的文章能坚持写到什么时候?总之既然决定了就一直写下去吧。

Android系统架构

自上而下分为:应用程序层(Application)咱们做应用的小伙伴就一直在这个层面工作、应用程序框架层(FrameWork)这个层里面我们会定义出供应用层调用的接口及一些与底层相关的JNI(Java Native Interface)为什么会有这样一种特殊的接口存在呢?看过Android系统源码的小伙伴都知道Android底层驱动的实现是通过C/C++代码实现的。而我们顶层的代码是Java,如何才能用Java调用到C/C++,这里就用到了JNI它是连接顶层与底层的桥梁、Android运行环境(Run Time)及库文件,这些库文件的作用是什么,它其实就是些功能库例如:图形界面、浏览器等等、Android 系统层(OS)这一层主要就是些驱动:显示驱动、键盘驱动、SIM卡驱动、内存驱动、电池驱动、USB 驱动、照相机驱动、Binder IPC驱动等等。

Android五大基本组件详解

  • Activity Activity 是我们最常见的组件了,在应用程序中一般一个Activity就是一个单独的屏幕。每一个活动都被实现为一个独立的类,而我们操作页面的类都要继承Activity,Activity将会提供给开发者一些操作UI的接口,而且还为开发者提供了这些UI的回调接口。众所周知,通常情况下一个APP会有几个或者更多的页面的组成,因此设计到了不同Activity之间的一些相互协调的行为,要想很好的协调好这些Activity之间的工作,对于Activity的生命周期就要非常的熟悉才行,如图1.1所示:
  • android 系统应用声明 android系统应用管理_应用程序

  • 这里引用这篇博主的关于生命周期的总结,写的非常详细我在这里就不再啰嗦了,这里还需要有几点知识的拓展:

Activity的启动模式

  • 启动模式简单地说就是Activity启动时的策略,在AndroidManifest.xml中的标签的android:launchMode属性设置;启动模式有4种,分别为standard、singleTop、singleTask、singleInstance;这里也就有了Android的启动栈,什么是栈呢?它好比就是一个容器,根据不同的需要这个容器的出栈顺序也是不一样的有先入先出(FIFO)、后入显出(LIFO)两种。那好咱们说明下上面所说的四种模式: 1、standard:每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈; 2、singleTop:如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例; 3、singleTask:如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop; 4、singleInstance:如果应用A的任务栈中创建了MainActivity实例,如果应用B也要激活MainActivity,则不需要创建,两应用共享该Activity实例;

Bundle savedInstanceState

  • 看到这个参数大家不陌生吧?没错大家看下这个基本代码段:
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }

}

具体怎么解释大家可以参考这位博主的帖子

  • Intent Android 通过intent类实现了与各个Activity之间的交互及页面切换。Intent意味Android的意图它描述了其根本的目的是什么。通过Intent我们既可以实现页面的切换还可以实现数据的传递。Intent的另外一个子类Intent Filter则是用来指定“我能做什么”,通常我们会在AndroidMainfest.xml去描述它。通过intent实现Activity的切换利用startActivity()方法去启动,这样Android系统就会遍历所有的应用程序的intent filter的 action ,并找到与其匹配的activity,因而这个Activity会接受Intent的消息,这样Activity仅仅只需要发送一个Intent 便可以重用其他的组件功能。 附:不错的intent讲解博文
  • Service Service首先其不具备UI页面但是却可以常驻Android系统的组件,Acitvity可以通过context.startService()启动一个Service。通过context.bindService()方法连接到一个Service上,这里从新绑定Service若未启动则会重新启动,反之则直接启动。这里因此也就出现了两对方法:.startService()和stopService()、bindService()和unbindService()方法,通常情况下service 在启动后即使startService()的进程析构了,但是其仍然存在,直到我们调用stopService()和stopSelf()为止,这里我说的是通常情况下,那就还有特殊情况下,大家都听说过“不死的service”,有种情况下service也会被回收的,当系统内存被占用过高的情况下,通常Androuid 会将一些优先级别低的和一些启动进程被回收的service给回收掉,所以也就出现如何实现“不死的service”。这里我也不过多讲述,大家可以等待以后这个系列我会在系统和应用两个层面两种技术手段去实现。
  • Receiver 按照套路解释名词,根据api 文档解释如下: 1、广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。 2、应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自BroadcastReceiver基类。 3、广播接收器没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。 其流程如下: 1、注册广播事件:注册方式有两种,一种是静态注册,就是在AndroidManifest.xml文件中定义,注册的广播接收器必须要继承BroadcastReceiver;另一种是动态注册,是在程序中使用Context.registerReceiver注册,注册的广播接收器相当于一个匿名类。两种方式都需要IntentFIlter。 2、发送广播事件:通过Context.sendBroadcast来发送,由Intent来传递注册时用到的Action。 3、接收广播事件:当发送的广播被接收器监听到后,会调用它的onReceive()方法,并将包含消息的Intent对象传给它。onReceive中代码的执行时间不要超过5s,否则Android会弹出超时dialog。
  • Content Provider 这个是android一种存储机制,这里大家回忆下Android有几种存储模式,是的5种分别是:SharedPreferences、文件(I/O)存储数据、SQLite存储数据、ContentProvider存储数据、网络存储数据(这个容易被忽视)。是的Content Provider作为五种存储方式之一其意义在于它有一套完整的接口在存储和获取数据方面。适用背景:当应用将数据存储到SQLite里面,或者存放到了其他设备中,若想让其他的应用程序使用程序中的数据时,其就用到了Content Provider。关于其接口函数,现在简单的列举下: 1、query:查询 2、insert:插入 3、update:更新 4、delete:删除 5、getType:得到数据类型 6、 onCreate:创建数据时调用的回调函数