第1章 开始启程,你的第一行 Android 代码
Android 系统架构:
Linux内核层、系统运行库层、应用框架层、应用层
四大组件
Activity
,Service
,BroadCast Receiver
,Content Provider
.
第2章 先从看得到的入手,探究活动
活动是一种可以包含用户界面的组件, 所有的活动都要在AndroidManifest.xml 中注册.
销毁一个活动:
finish()
或Back
键.Intent:
Intent 是 Android 程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent 一般可被用于启动活动、启动服务、以及发送广播等场景.
显式Intent
Intent intent = new Intent(FirstActivity.this, SecondActivity.class) startActivity(intent);
隐式Intent
指定action 和 category 等信息,然后交由系统去分析这个 Intent, 并帮我们找出合适的活动去启动.
在标签下配置的内容,可以指定当前活动能够响应的 action 和 category.Intent intent = new Intent("com.example.activitytest.ACTION_START");
intent.setData(Uri.parse("http://www.baidu.com"));
向下一个活动传递数据
添加数据:
intent.putExtra("extra_data", data);
取出数据:String data = intent.getStringExtra("extra_data");
返回数据给上一个活动
startActivityForResult(intent, 1);
Activity生命周期
生命周期
活动被回收了怎么办
应用中有一个活动 A,用户在活动 A 的基础上启动了活动 B,活动 A 就进入了 停止状态,这个时候由于系统内存不足,将活动 A 回收掉了,然后用户按下 Back 键返回活 动 A,会出现什么情况呢?其实还是会正常显示活动 A 的,只不过这时并不会执行 onRestart() 方法,而是会执行活动 A 的 onCreate()方法.
onSaveInstanceState()回调方法,在活动被回收之前调用,可以保存临时数据.
- onSaveInstanceState()方法会携带一个 Bundle 类型的参数,比如可以使用 putString()方法保存字符串, 使用键值对的形式保存.
活动的启动模式
standard
: 每次启动都会创建该活动的一个新的实例,放入返回栈中.singleTop
:栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例.若不在栈顶,会重新创建Activity.singleTask
:每次启动该活动时系统首先 会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈.singleInstance
:会启用一个新的返回栈来管理这个活动.解决多个应用共享Activity实例的问题。
第3章 软件也要拼脸蛋,UI 开发的点点滴滴
常用控件
TextView, Button, EditText, ImageView, ProgressBar, AlertDialog, ProgressDialog
布局
LinearLayout: vertical 或horizontal
RelativeLayout: android:layout_alignParentLeft…
FrameLayout: 所有控件都在左上角(重合)
TableLayout:
GridLayout:
AbsoluteLayout: 弃用
ListView
需要借助适配器来将数据传给ListView.
ArrayAdapter。它可以通过泛型来指定要适配的数据类型,然后在构造函数中把要适配的数据传入.
借助一个 ViewHolder 来进行性能优化.
新增了一个内部类 ViewHolder,用于对控件的实例进行缓存。所有控件的实例都缓存在了 ViewHolder 里,就没有必要每次都通过 findViewById()方法来获取控件实例了。
点击事件:
setOnItemClickListener()
第4章 手机平板要兼顾,探究Fragment
Fragment与Activity通信
调用 FragmentManager 的 findFragmentById()方法,可以在活动中得到相应Fragment的实例, 然后就能轻松地调用碎片里的方法了.
每个Fragment中都可以通过调用 getActivity()方法来得到和当前Fragment相关联的Activity实例 .
Fragment生命周期:
总是依附于Activity存在.
比Activity多的回调方法:
- onAttach() 当碎片和活动建立关联的时候调用。
- onCreateView() 为碎片创建视图(加载布局)时调用。
- onActivityCreated() 确保与碎片相关联的活动一定已经创建完毕的时候调用。
- onDestroyView() 当与碎片关联的视图被移除的时候调用。
- onDetach() 当碎片和活动解除关联的时候调用。
第5章 全局大喇叭,详解广播机制
广播机制
- 标准广播(Normal broadcasts): 异步
- 有序广播(Ordered broadcasts): 同步,可截断
接收系统广播
创建广播接收器: 新建一个类,继承自 BroadcastReceiver,并重写父类的 onReceive()方法.
动态注册
在代码中注册,注册的逻辑写在 onCreate()方法中.
静态注册
在AndroidManifest.xml中注册,比如实现开机启动.
发送自定义广播
- 标准广播: sendBroadcast()
- 有序广播: sendOrderedBroadcast()方
使用本地广播
- 使用LocalBroadcastManager 来对广播进行管理.
- 本地广播是无法通过静态注册的方式来接收的.
- 发送本地广播比起发送系统全局广播将会更加高效.
第6章 数据存储全方案,详解 持久化技术
文件存储
- 适合用于存储一些简单的文本数据或二进制数据.
- 将数据存储到文件中
Context 类中提供了一个 openFileOutput()方法
out = openFileOutput("data", Context.MODE_PRIVATE);
- 从文件中读取数据
Context 类中还提供了一个 openFileInput()方法 SharedPreferences
- 使用键值对存储
- 将数据存储到 SharedPreferences 中
- 首先需要获取到SharedPreferences对象(3种方法)
- Context 类中的 getSharedPreferences()方法
- Activity 类中的 getPreferences()方法
- PreferenceManager 类中的 getDefaultSharedPreferences()方法
- 开始存数据(3步):
- 调用 SharedPreferences 对象的 edit()方法来获取一个 SharedPreferences.Editor 对象
- 向 SharedPreferences.Editor 对象中添加数据,比如putString()等.
- 调用 commit()方法将添加的数据提交.
- 首先需要获取到SharedPreferences对象(3种方法)
- 从 SharedPreferences 中读取数据
- 通过SharedPreferences 对象,然后分别调用它的 getString()、getInt()和 getBoolean()等方法.
SQLite数据库
- 创建数据库
- 升级数据库
- 添加数据
- 更新数据
- 删除数据
- 查询数据
- 使用SQL