美文网首页instapaper程序员
<第一行代码>chapter 1 and 2

<第一行代码>chapter 1 and 2

作者: HeilHelloWorld | 来源:发表于2016-03-22 17:48 被阅读274次

    初衷

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

    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,不足之处还请指证.
    希望自己可以坚持下去,把自己学到的东西写出来.
    目前计划是先写完这本书的总结,最近课也比较多,先不考虑别的了.

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

    相关文章

      网友评论

      • Jeongho:刚才还用到郭霖大神写的actionStart那个启动activity的方法 :smile:
        得规范代码 :joy:
      • Jieqiudedede:狗神?
      • Jeongho:马马虎虎看了两遍第一行代码。不写都忘记了,看了你的笔记,感觉都尼玛白看了。重新想再看一遍 :joy: 坚持住~
        HeilHelloWorld: @Jeongho 一起加油💪💪💪
        Jeongho: @HeilHelloWorld 得向你学习啊😁
        HeilHelloWorld: @Jeongho 加油啊😁每个人都有每个人学习的方法,还在摸索中呀嘿嘿。
      • dc881c029554:哇偶,我最近刚刚看这本书,你笔记写的太好了,坚持下去,我会持续关注哦~
      • 饕餮潴:安卓系统现在是五层了 加了一个硬件抽象层
        HeilHelloWorld:@饕餮潴 谢谢提醒,还真没接触过这个概念 ,但是一查发现是个很重要的层面.要学习的还有很多啊 :grin:
      • Joy___:恭喜 开张大吉
        HeilHelloWorld:@Martin_wjl 谢谢乐哥捧场

      本文标题:<第一行代码>chapter 1 and 2

      本文链接:https://www.haomeiwen.com/subject/rimklttx.html