<第一行代碼>chapter 1 and 2

初衷

書讀完很久了,但是最近才意識到只輸入不輸出的學習是沒有意義的.所以才決定開始自己寫一些東西將自己的想法與收獲寫出來.

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,不足之處還請指證.
希望自己可以堅持下去,把自己學到的東西寫出來.
目前計劃是先寫完這本書的總結,最近課也比較多,先不考慮別的了.

發表啦.哈哈,不知道有沒有人看.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容