instapaper程序员

<第一行代码>chapter 1 and 2

2016-03-22  本文已影响274人  HeilHelloWorld

初衷

书读完很久了,但是最近才意识到只输入不输出的学习是没有意义的.所以才决定开始自己写一些东西将自己的想法与收获写出来.

chapter 1

贴一张经典的图吧

android系统架构:

系统架构:

  1. android系统是基于linux内核的,从4.0开始基于linux3.x,目前的AOSP6.0 Marshmallow是基于linux3.18.10,但是不同厂家的发行版可能采用的内核版本是不同的,目前来讲我还没研究到那么深刻...
  2. 第二层就是系统运行库层了,左边绿色的部分是一些C/C++库提供的特性支持,绘图啊,浏览器啊,轻量数据库,右边黄色的部分则分别是核心库来让开发者使用java语言来开发应用,而关于虚拟机,目前有dalvik与art两种模式,区别贴个链接吧,不赘述了.
    https://zh.wikipedia.org/wiki/Android_Runtime
  3. 应用框架层看起来就很面熟了,开发时要用到的系统API大都来自于这里,android的核心应用大多都是基于这些API完成开发的.
  4. 应用层就不说了,大家平常使用的话就是它了.

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的内容.

基本操作

  1. 创建类继承自Activity,重写onCreate方法
    @Override protected void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); }
  2. 在onCreate方法中调用setContentView(R.layout.layout_my)方法来加载布局文件
    setContentView(R.layout.my_layout);
  3. 在AndroidMainifest文件中注册
    在<application>标签对中,采用<activity>标签对的形式来注册


    注册示例
  4. 隐藏标题栏
    requestWindowFeature(Window.FEATUR_NO_TITLE);
  5. Toast的使用,轻巧的提醒方式简单示例
    Toast.makeText(MainActivity.this,"Message",Toast.LENGTH_SHORT).show();
    别忘记调用show()方法.
  6. 使用Menu
新建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的基本使用方法

  1. 显式Intent
    Intent intent = new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent);
    Intent有很多种构造方法,上面是其中一种.这是最简单的启动另一个活动的办法.
  2. 隐式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);
  3. 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携带的数据
  4. 返回数据给上一个活动.
    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,不足之处还请指证.
希望自己可以坚持下去,把自己学到的东西写出来.
目前计划是先写完这本书的总结,最近课也比较多,先不考虑别的了.

发表啦.哈哈,不知道有没有人看.

上一篇下一篇

猜你喜欢

热点阅读