Android基礎之四:四大組件(Activity)

  • 一個Activity表示一個屏幕,固然在早期應用程序中這樣理解可能不太準確,由於早期不少效果都是使用對話框形式的Activity或者半透明半覆蓋的Activity來在當前Activity中顯示相關操做的,可是如今只要是合格的程序員都不會再在同一個屏幕中顯示兩個以上Activity
  • 建立Activity
    • 建立繼承自Activity的類
      • Activity的生命週期
        • onCreate:建立
        • onStart:開始顯示
        • onResume:徹底顯示,處於激活狀態,擁有焦點
        • onPause:退出到下層顯示
        • onSaveInstanceState:保存狀態響應
        • onStop:退出顯示
        • onDestory:銷燬釋放
        • onReStart:從退出顯示狀態從新顯示
        • onConfigurationChanged:配置發生改變,須要在Manifest中註冊的時候添加configchange參數
      • 定義Activity一般須要重寫的方法
        • onCreate:必有
        • onDestory:通常有
        • onConfigurationChanged:通常有
        • onSaveInstanceState:通常有
      • Activity切換髮生的生命週期變化:A-->B
        • A:onPause
        • B:onCreate
        • B:onStart
        • B:onResume
        • A:onStop(可能不觸發,當B不徹底覆蓋A時不觸發)
      • 在Manifest文件中註冊Activity
        • activity節點
          • 是application的子節點,屬性默認繼承自application
        • 屬性
          • icon:ActionBar中顯示的圖標
          • logo:ActionBar中顯示的徽標
          • name:實現類
          • label:ActionBar中顯示的標題
          • describtion:描述
          • theme:主題
          • alwaysRetainTaskState:保持後臺運行,儘可能不自動銷燬回收
          • configChanges:須要監聽的配置信息
          • enabled:是否可用
          • permission:需求權限
          • exported:是否公開,用於外部應用跨應用使用Activity
          • hardwareAccelerated:硬件加速
          • launchMode:啓動模式
          • screenOritation:屏幕方向
          • windowSoftInputType:鍵盤彈出方式
          • showOnLockScreen:在鎖屏中顯示,相似QQ
        • 子節點
          • category:類別,通常默認爲DEFAULT,主Activity爲LAUNCHER
          • action:通常自定義,可是注意特殊action:BROWSERABLE和VIEW
          • data:路由匹配
            • scheme:協議
            • host:IP
            • port:端口
            • path:路徑
        • action與data一般用於隱式Intent加載Activity須要
      • 代碼中啓動與關閉Activity
        • 無返回值啓動:startActivity(intent)
        • 監聽返回值啓動:startActivityForResult(intent)
          • onActivityResult
        • 關閉當前Activity:finish()
        • 關閉以前給上一個Activity返回值:setResult(resultCode,intent);
        • 關於啓動Activity的Intent
          • 顯示Intent:經過Activity類名來建立:
          • Intent intent=new Intent(MyActivity.this,TAct.class);
          • 經過setComponent建立顯示Intent
          • Intent intent=new Intent();
            intent.setComponent(new ComponentName(getPackageName(),"com.example.AndroidTest_01.TAct"));//全路徑
          • 隱式Intent
            • 經過action建立
            • Intent intent=new Intent("con.example.AndroidTest_01.action.test");
              //或者
              Intent intent=new Intent();
              intent.setAction("con.example.AndroidTest_01.action.test");
            • 經過data建立
            •  Intent intent=new Intent();
               intent.setData(Uri.parse("scheme://host:port/path"));
            • 隱式Intent啓動Activity須要先判斷可否解析成Activity
            • ComponentName componentName=intent.resolveActivity(getPackageManager());
              if(componentName==null){
                   //..沒法解析
              }
        • 啓動Activity數據傳遞
          • putExtra()方式附加到intent中傳遞
          • intent.putExtra("a","sss");
          • putExtra()附加Bundle
          •  Bundle bundle=new Bundle();
             bundle.putString("title","aaaaa");
             intent.putExtra("a",bundle);

            Bundle是Android中一個數據結構優化機制類,與Java中的Map同樣,可是Bundle更加高效,在Android中通常不使用Map,是用Bundle代替Mapandroid

          • 自定義數據Modle類
            • 定義繼承自Serializable接口的類
            • public class Modle1 implements Serializable {
              
              }
              Intent intent=new Intent(MyActivity.this,TAct.class);
              intent.putExtra("a",new Modle1());

              Serializable接口中已經封裝了序列化機制,不須要開發者本身去實現,使用很是簡單,可是在Android中不適合使用,其內部一套序列化機制是針對全部類型封裝的,是Java提供的一個通用接口,效率較低程序員

            • 定義繼承自Parcelable接口的類
            • public class Modle2 implements Parcelable {
                  private String name;
                  public Modle2(String name){
                      this.name=name;
                  }
                  @Override
                  public int describeContents() {
                      return 0;
                  }
                  @Override
                  public void writeToParcel(Parcel dest, int flags) {
                      dest.writeString(this.name);
                  }
                  public static final Creator<Modle2> CREATOR=new Creator<Modle2>() {
                      @Override
                      public Modle2 createFromParcel(Parcel source) {
                          return new Modle2(source.readString());
                      }
              
                      @Override
                      public Modle2[] newArray(int size) {
                          return new Modle2[size];
                      }
                  };
              }

              須要本身實現序列化機制,同時須要建立一個公共靜態終態Creator類型成員屬性CREATOR,Parcelable是Android提供的一種序列化機制,是徹底用於Android開發的,所以效率較Serializable高出不少,一般使用Parcelable來進行自定義類型參數傳遞瀏覽器

          • 傳遞參數Intent能夠直接傳遞Bundle,所以通常不須要使用自定義類型參數來傳遞,Bundle中能夠包含任何數據類型,只有當存在通用模板時,爲了方便贊成維護等才須要使用自定義參數類來實現參數傳遞
          • Data傳遞數據
          • intent.setData(Uri.parse("scheme://host:port/path?a=sss&b=adsa"));

            經過intent的Data來傳遞數據,相似url傳參數據結構

        • Activity接收數據
          • Extra傳遞的參數
          • Intent intent=getIntent();
            String s=intent.getStringExtra("aa");
            //或者
            Bundle b=intent.getExtras();
          • 自定義傳遞參數app

          • Intent intent=getIntent();
            Modle1 m= (Modle1) intent.getSerializableExtra("a");
            //或者
            Modle2 modle2=intent.getParcelableExtra("a");
          • Data傳遞參數ide

          • Intent intent=getIntent();
            Uri uri=intent.getData();
            String a=uri.getQueryParameter("a");
        • Activity啓動模式
          • standard:標準模式,默認模式,Activity註冊時不配置android:launchMode參數就表示默認採用standard模式啓動,該模式在啓動Activity時不會去檢查棧中是否已經存在要打開的那個Activity,都會建立一個新的目標Activity實例,而後啓動新的實例,就算是本身打開本身,也會生成兩個,會執行打開動畫
          • singleTop:棧頂模式,當要打開的Activity處於棧頂時,就不會再執行建立實例操做,即不會執行本身打開本身的操做,可是若是不在棧頂,那麼無論棧中是否已存在目標實例,都會對目標Activity進行實例化
          • singleTask:單任務模式,任務即棧,使用該模式啓動的Activity存在於一個單獨的棧中,並非與主Activity在同一個棧中,並且在啓動Activity時會檢查是否已存在實例,若是存在不會繼續建立新的實例,而是打開原有實例,而且銷燬中間的其餘Activity實例
          • singleInstance:Activity處於單獨的棧中,Activity不能共用一個棧
        • 跨應用啓動Activity
          • 跨應用啓動Activity沒法經過類來建立顯示Intent啓動
          • 可使用action隱式啓動
          • 可使用data隱式啓動
          • 可使用setComponent顯示啓動
          • 須要啓動的Activity必須配置android:exported=true屬性進行暴漏
        • 瀏覽器url或超連接啓動Activity
          • intent-filter新增一個category參數
          •  <intent-filter>
                   <category android:name="ANDROID.INTENT.CATEGORY.APP_BROWSER"></category>
                   <action android:name="ANDROID.INTENT.ACTION.VIEW"></action>
                   <category android:name="ANDROID.INTENT.CATEGORY.DEFAULT"></category>
              </intent-filter>
          • 將action改成VIEW支持
          • 單獨定義url識別
          • <data android:scheme="aa"></data>

            添加協議,路由,ip等,只要知足需求的url都會啓動該Activity優化

          • Activity最終配置成暴漏模式:andropid:exported=true
        • 主Activity配置
          • category配置成LAUNCHER
          • category配置成MAIN
          • <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
相關文章
相關標籤/搜索