<第一行代码>chapter 1 and 2
初衷
书读完很久了,但是最近才意识到只输入不输出的学习是没有意义的.所以才决定开始自己写一些东西将自己的想法与收获写出来.
chapter 1
贴一张经典的图吧
android系统架构:系统架构:
- android系统是基于linux内核的,从4.0开始基于linux3.x,目前的AOSP6.0 Marshmallow是基于linux3.18.10,但是不同厂家的发行版可能采用的内核版本是不同的,目前来讲我还没研究到那么深刻...
- 第二层就是系统运行库层了,左边绿色的部分是一些C/C++库提供的特性支持,绘图啊,浏览器啊,轻量数据库,右边黄色的部分则分别是核心库来让开发者使用java语言来开发应用,而关于虚拟机,目前有dalvik与art两种模式,区别贴个链接吧,不赘述了.
https://zh.wikipedia.org/wiki/Android_Runtime - 应用框架层看起来就很面熟了,开发时要用到的系统API大都来自于这里,android的核心应用大多都是基于这些API完成开发的.
- 应用层就不说了,大家平常使用的话就是它了.
Logcat
android的日志工具,书里是用eclipse来说明例子的,我是用android studio.
Logcat一般是这个样子的Log level可以根据你打印日志调用的方法分别显示
Log.v() - verbose - 琐碎的日志信息
Log.d() - debug - 调试信息
Log.i() - info - 打印重要的数据
Log.w() - warn - 警告信息,风险提示的作用
Log.e() - error - 错误信息
各方法的参数就不再赘述,以Log.d()为例,官方API推荐以下使用方式定义TAG
private static final String TAG = "MyActivity"; Log.v(TAG, "index=" + i);
chapter 2
第二章介绍的是关于Activity的内容.
基本操作
- 创建类继承自Activity,重写onCreate方法
@Override protected void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); }
- 在onCreate方法中调用setContentView(R.layout.layout_my)方法来加载布局文件
setContentView(R.layout.my_layout);
-
在AndroidMainifest文件中注册
在<application>标签对中,采用<activity>标签对的形式来注册
注册示例 - 隐藏标题栏
requestWindowFeature(Window.FEATUR_NO_TITLE);
- Toast的使用,轻巧的提醒方式简单示例
Toast.makeText(MainActivity.this,"Message",Toast.LENGTH_SHORT).show();
别忘记调用show()方法. - 使用Menu
在Activity中重写onCreateOptionMenu()方法
@Override public boolean onCreateOptionMenu(Menu menu) { getMenuInflater().inflate(R. menu.my_menu,menu); return true; }
getMenuInflater()获取MenuInflater对象,调用其inflate方法,第一个参数代表我们要使用的menu资源,第二个参数代表要将此menu资源添加到哪个menu对象中去,添加成功返回true
-- 如何定义菜单响应事件呢:
重写Activity的onOptionItemSelected()方法
@Override public boolean onOptionItemSelected(MenuItem item) { switch(item.getItemId) { } return true; }
7.销毁一个活动的简单方法
finish();
Activity类提供了一个finish()方法,可以很方便的销毁活动
Intent的基本使用方法
- 显式Intent
Intent intent = new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent);
Intent有很多种构造方法,上面是其中一种.这是最简单的启动另一个活动的办法. - 隐式Intent
隐式Intent更倾向于让系统分析这个Intent来选择启动合适的活动,这个合适与否是根据我们定义action 和category等信息来判断的.
在AndroidMainifest文件中注册的activity标签包含一个intent-flater标签,然后在此标签下可以包含action与category两个标签.
<action action/>
<category category/>
<data data/>
(只有当两标签的内容同时匹配Intent中指定的action与category时,该活动才能响应此Intent)
在Activity中定义Intent如下:
Intent intent = new Intent("action"); intent.addCategory(category); intent.addData(data);
- Intent用于数据传递
Activity1: Intent intent = new Intent(Acitivity1.this,Activity2.class); Intent.putExtra(“key”,data); startActivity(intent); 用putExtra方法来给intent附带数据,第一个参数是键值,第二个是数据
Activity2: Intent intent = getIntent(); 在Activity2里调用getIntent方法来获取到启动它的Intent,获取一个Intent对象,然后调用Intent对象的各种get方法通过键值来获取Intent携带的数据
- 返回数据给上一个活动.
Activity1: startActivityForResult(intent,1); @Override protected void onActivityResult(int requestCode,int resultCode,Intent data) { //这里用switch语句判断requsetCode来对数据进行操作 }
Activity2: setResult(RESULT_OK,intent); 这个intent装载返回的数据,RESULT_CANCELED 或者 RESULT_OK
如果是按返回键回到上一个活动,可以重写onBackPressed方法,
@Override public void onBackPressed() { setResult(RESULT_OK,intent); }
活动的生命周期
返回栈
Android是使用Task来管理活动的,一个任务就是一组存放在栈里的活动,这个栈叫Back Stack.
贴两张图
生命周期金字塔模型 生命周期示意图关于生命周期里的方法,感觉可以单独写一篇...先不说了
活动被回收了怎么办
onSaveInstanceState()方法来救你:
还是以键值对的方式来保存.
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("hhh","hello");
}
在onCreate()方法里可以去使用这个savedInstanceState:
if (savedInstanceState != null) {
String data = savedInstanceState.getString("hhh");
}
活动的启动模式
默认的活动启动模式是standard,修改启动模式的方式是通过修改AndroidMainifest里<Activity>标签的android:launchMode="",比如:
android:launchMode = "singleTask"
standard
每次启动一个活动,都会新建一个活动实例并push到返回栈里
singleTop
每次启动一个活动之前,都会先检查返回栈的栈顶是否是这个活动的一个实例,如果有则不创建新活动实例,直接启动这个栈顶的活动.
singleTask
启动这个活动之前检查返回栈是否有这个活动的实例,如果没有,新建一个返回栈,并新建一个活动push进去,如果返回栈有这个活动的实例就使用它,这个拥有singleTask的返回栈是接受其他活动入栈的.
singleInstance
与singleTask差不多,不过不接受其他活动入栈.
在这里留下官方文档的地址吧,
http://developer.android.com/intl/zh-cn/guide/topics/manifest/activity-element.html
书里的最佳实践
这个部分是书里对每章的学习做的一个实践的练习,很有意义.本章有三个实践.
知晓当前是在哪一个活动
写一个BaseActivity在onCreate()方法里添加一个Log方法,打印当前活动名,方便找到哪个界面对应哪个活动,让所有Activity都继承自BaseActivity,获取活动名的方法如下.
getClass().getSimpleName();
随时随地退出程序
思路是建立一个集合的管理器,非常的容易理解
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();
}
}
}
}
分别在BaseActivity里的onCreate和onDestroy方法里调用 add与remove方法,想结束所有任务就调用finishAll方法.
启动Activity的最佳写法
个人目前感觉还用不太多,可能是没做过团队合作的东西吧.
思路很清晰,就是在被启动的活动中实现一个方法,这个方法可以接受很多参数,但是应该要有Context参数来判断是谁启动它.示例:
public static void actionStart(Contex contex, String data) {
Intent intent = new Intent(contex, ThisActivity.class);
intent.putExtra("key",data);
contex.startActivity(intent);
}
启动实例:
ThisActivity.actionStart(Activity.this,data);
总结
第一次写博客,第一次用markdown,不足之处还请指证.
希望自己可以坚持下去,把自己学到的东西写出来.
目前计划是先写完这本书的总结,最近课也比较多,先不考虑别的了.
发表啦.哈哈,不知道有没有人看.