学习安卓很长时间了,但所学的知识不成系统,在开发的时候遇到问题只会Google,而且同样的问题要Google很多次才能记得下来,总结之后发现我并没有理解问题出现的原因,只是盲目的找不同的解决方案,不停的改改改,花了很长时间,终于改到自己想要的效果,于是很兴奋的便继续往下写,如此循环往复,最终导致我的编程能力不升反降,抄代码的能力却日渐提高,作为一个有内涵的程序猿,我一定要改正这种“懒惰”习惯,理解编程的本质,了解问题的原理,真正意义上的敲代码,提高。于是我就准备选择一本书籍来巩固自己的基础,郭神的第一行代码由浅入深,分析合理透彻,并且在书中写了自己在项目开发中的经验,所以果断选择了这本书。并记录自己在读第一行代码的时候的收获
安卓系统的架构
-
Android 大致可以分为四层架构,五块区域
- Linux 内核层
Android 系统是基于Linux 2.6 内核的,这一层为Android 设备的各种硬件提供了底
层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi 驱动、电源管理等。
- 系统运行库层
这一层通过一些C/C++库来为Android 系统提供了主要的特性支持。如SQLite 库提供了数据库的支持,OpenGL|ES 库提供了3D 绘图的支持,Webkit 库提供了浏览器内核的支持等。同样在这一层还有Android 运行时库,它主要提供了一些核心库,能够允许开发者使用Java 语言来编写Android 应用。另外Android 运行时库中还包含了Dalvik 虚拟机,它使得每一个Android 应用都能运行在独立的进程当中,并且拥有一个自己的Dalvik 虚拟机实例。相较于Java 虚拟机,Dalvik 是专门为移动设备定制的,它针对手机内存、CPU 性能有限等情况做了优化处理。
- 应用框架层
这一层主要提供了构建应用程序时可能用到的各种API,Android 自带的一些核心应用就是使用这些API完成的,开发者也可以通过使用这些API来构建自己的应用程序。
- 应用层
所有安装在手机上的应用程序都是属于这一层的,比如系统自带的联系人、短信等程序,或者是你从Google Play 上下载的小游戏,当然还包括你自己开发的程序。
探究活动
-
活动是什么
活动(Activity)是最容易吸引到用户的地方了,它是一种可以包含用户界面的组件,主要用于和用户进行交互。
- 恢复被系统回收时activity存储的临时数据---->onSaveInstanceState() outState.putString("key","value"); 可以在onCreate方法中通过getString获得
- 隐藏标题栏:在onCreate方法中添加---->requestWindwFeature(Window.FEATURE_NO_TITLE);注意要在setContentView之前执行
-
活动的生命周期
掌握活动的生命周期对任何Android 开发者来说都非常重要,当你深入理解活动的生命周期之后,就可以写出更加连贯流畅的程序,并在如何合理管理应用资源方面,你会发挥的
游刃有余。你的应用程序将会拥有更好的用户体验。
- onCreate()
这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动第一次被创建的时候调用。
- onStart()
这个方法在活动由不可见变为可见的时候调用。
- onResume()
这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的栈顶,并且处于运行状态。
- onPause()
这个方法在系统准备去启动或者恢复另一个活动的时候调用。
- onStop()
这个方法在活动完全不可见的时候调用。它和onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么onPause()方法会得到执行,而onStop()方法并不会执行。
- onDestroy()
这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。
- onRestart()
这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
-
活动的启动模式:
标签的launchMode设置 - Standard
standard 是活动默认的启动模式,在不进行显式指定的情况下,所有活动都会自动使用这种启动模式。
- SingleTop
当活动的启动模式指定为singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。不过当FirstActivity 并未处于栈顶位置时,这时再启动FirstActivity,还是会创建新的实例的。
- singleTask
当活动的启动模式指定为singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
- singleInstance
使用
singleInstance 模式就可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题。
-
活动的最佳实践
- 直接退出应用
用一个专门的集合类对所有的活动进行管理就可以了,可以通过BaseActivity让每个启动的Activity都添加,在onDestroy中remove掉就可以了
/**
* Created by Keith
*/
public class ActivityCollector {
public static List<Activity> activities = new ArrayList<Activity>();
public static void addActivity(Activity activity){
activities.add(activity);
}
public static void removeActivity(Activity activity){
activities.remove(activity);
}
public static void finishAll(){
for(Activity activity:activities){
if(!activity.isFinishing()){
activity.finish();
}
}
}
}
- 启动Activity的最佳方法:当进行项目对接的时候如果我们想把自己写的FirstActi传入两个非常重要的参数到其他程序员写SecondActivity的时候,我们为了避免麻烦,就会在Activity中加入一个启动Activity的方法,通过这个方法我们可以一目了然的启动并传值给Activity。例如:
//在SecondActivity中写启动SecondActivity的方法
public static void actionStart(Context context,String data1,String data2){
Intent intent = new Intent(context,SecondActivity.class);
intent.putExtra("param1",data1);
intent.putExtra("param2",data2);
context.startActivity(intent);
}
//在FirstActivity中启动并传值
SecondActivity.actionStart(FirstActivity.this,"data1","data2");