搜尋此網誌

2011年3月15日

Android Application Model Lab - Android AP實驗室 (Part2)

測試目的: 呼叫 Activity 內部與外部呼叫 (Flag 留到下次再測)
測試項目: (Stack 變化可從 dump app stat 中取得)

  1. 呼叫內部 Activity (w/wo Finish(), Stack 變化)
  2. 呼叫外部 Activity (w/wo Finish(), Stack 變化)
Case1: 呼叫內部 Activity by startActivity()
  1. Call internal activity without finish()
    • A1 -> A2 -> A3, then back to HOME, then re-launch, then press return key:
        • A3 -> A2 -> A1 -> HOME
  2. Call internal activity with finish()
    • A1 -> A2.finish() -> A3, then back to HOME, then re-launch, then press return key:
      • A3 -> A1 -> HOME
  3. 結論: 使用 finish() 後,該 activity 將會從 activity stack 中移除,等同按 Return key

Case2: 呼叫內部 Activity by stratActivityForResult()
  1. The program: A(A1/A2/A3)
  2. Case A: A1 -> (startActivity) ->  A2 -> (startActivityForResult, int(pattern1)) -> A3 (get pattern1, pattern1++, Finish())
    • 結論: (變數名稱要一致,且 A3 一定要搭配 Finish();)
      • 假設 pattern1 = 1。A3 finish 後,A2 取出的 pattern1 = 1。(也就是說,pattern1++ 後,A2 看到的還是舊 pattern1 = 1)
      • pattern1 變數名稱要一樣,若 A3 宣告成 (pat3 = pattern1, pat3++),A2 收到的 pattern1 = 0。 
  3. Case B: A1 -> (startActivity) ->  A2 -> (startActivityForResult, int(pattern1)) -> A3 (get pattern1, pattern1++, Intent-Browser)
    • Browser 會直接被 Intent 起來,A2 不會收到任何 return value。

Case3: 呼叫外部 Main Activity by stratActivity()
  1. Two programs: A(A1/A2/A3) & B(B1/B2)
  2. Activity call: A(A1 -> A2 -> A3 -> B1) / B(B1 -> B2)
  3. Step:
    • Launch A (A1 -> A2 -> A3 -> B1 -> B2) => 最後畫面是 B2
    • Back to HOME, then launch B(B1 -> B2), then press return key to B(B1) => 最後畫面是 B1
    • Back to HOME, then check A & B program UI
      • Re-launch A => Latest UI is B2
      • Re-launch B => Latest UI is B1
      • Re-launch A => Still at B2
  4. 結論: 
    • 當 A3 呼叫 B1 Activity 時,Mem 會產生兩個 Process, 一個是 A 的,一個是 B 的
    • 同一個 Process 所 launch 的 activity 都會在該 Task's activity stack 中,儘管包含不同 application 的 activity


Case4: 呼叫外部 Activity (呼叫 2nd's sub activity)
  1. Same way as case3
  2. 結論: (Same as Case3)
    • 呼叫別人的 Layout (xx.xml),要將變數全數 implement 到 code 裡。(setContentView(R.layout.main);)
    • Intent activity:
      • 同一個 program:
        • Intent intent1 = new Intent();
        • intent1.setClass(HelloLabTest.this, Activity2.class);
        • startActivity(intent1);
      • 不同 program:
        • Intent intent1 = new Intent();
        • intent1.setClassName("com.android.test2", "com.android.test2.Activity10");
        • startActivity(intent1);.

  
Case5: 呼叫外部 Activity,配合 finishActivity()
Case6: Key vs Package

  1. [轉] Package name 不同,則簽名key是否相同無所謂,兩個apk都可以安裝。
  2. [轉] Package name 相同,簽名key相同則會覆蓋
  3. [轉] Package name 相同,簽名不同則第二個apk安裝會失敗。
Case7: [轉] 不同 Apk,Share User ID 相同
  1. XML 修改: android:sharedUserId="com.demouser"
  2. 導出/data/system/packages.xml,查看其內容


參考資料:

沒有留言:

張貼留言