Android學習(一) - Activity

來源:互聯網
上載者:User

標籤:android   winform   style   blog   http   color   java   使用   

  好久不寫部落格了,自上次寫到現在已經一年多了,寫這東西其實堅持下來就好了,將自己學的東西一點點寫出來成為日後的積累查閱的資料。最近不是特別忙,抽點時間學學移動開發。

Android組件中常用的四大組件

  1.Activity

  2.Service服務

  3.Content Provider內容提供者

  4.BroadcastReceiver廣播接收器

一、Activity

  大家第一眼看到這個東西的時候,肯定想問這是個什麼東西?開啟手機隨便開啟一個應用,看到的螢幕就是一個Activity,點擊按鈕進入另一螢幕,這也是一個Activity,一個Activity通常就是指一個單獨的螢幕,你所見的按鈕、輸入框等就承載在Activity上,你可以把它看成web中的一個頁面,WinForm中的一個Frame, wpf中的一個Window,它就是一個可以承載控制項的容器將你介面上的布局呈現給你。

  1.Activity生命週期

    經典的生命週期圖,不多做解釋,清晰明了,圖中也給出了Activity中的函數調用關係,這裡我需要強調一下需要注意的地方。

      1.當一個介面被全部覆蓋和部分覆蓋所調用的函數式有所不同的,當前頁面被遮蓋一部分時,onStop()不會被調用,再次被啟用時onStart()也不會被調用,從圖上也可以看出有這條路徑,當全部覆蓋時,這兩個函數才會被調用。

      2.另外需要注意的是最左邊的那條線,當記憶體不足時,不處於啟用狀態的Activity可能會被回收掉,所以不處於啟用狀態的Activity需要注意儲存當前頁面的狀態,以便在再次建立的時候恢複被殺死前的狀態。狀態儲存我們需要重寫public void onSaveInstanceState(Bundle outState) 將資料放入outState這個Bundle(看成Java中的Map,C#中的Dictionary,就是存放索引值對)中,在onCreate的時候恢複即可。這一還有需要注意的一點:onSaveInstanceState()並不是永遠都會調用。比如,當使用者在一個activity上按返回時,就不會調用,因為使用者此時明確知道這個activity是要被銷毀的,並不期望下次它的樣子跟現在一樣。

  

  2.頁面資料傳遞

    頁面的資料傳遞離不開Intent,又是一個新奇的玩意,百度一下,中文翻譯成意圖,意圖是個什麼東西,感覺翻譯的好生硬,完全就是英文字典中的翻譯嘛,看下百度百科中的解釋:

      Intent(意圖)主要是解決Android應用的各項組件之間的通訊。

      Intent負責對應用中一次操作的動作、動作涉及資料、附加資料進行描述,Android則根據此Intent的描述,負責找到對應的組件,將 Intent傳遞給調用的組件,並完成組件的調用。因此,Intent在這裡起著一個媒體中介的作用,專門提供組件互相調用的相關資訊,實現調用者與被調用者之間的解耦。      解釋還算可以最起碼看了大概知道它是幹什麼用的了,下面看下怎麼用    (1)傳資料到新頁面, Intent存放資料跟Bundle一模一樣,他們繼承自相同的介面(Parcelable, Cloneable)。如下代碼,其中name是你自己定義的索引值,value是要傳遞的資料,這裡傳遞的資料只可以是基礎資料型別 (Elementary Data Type)和可序列化的類型,一般對象不可以傳遞。
  //傳遞頁面
 Intent intent = new Intent(); intent.putExtra(name, value) intent.setClass(this, Activity.class);//這裡參數Activity是樣本,需要替換成你要開啟頁面的名字 this.startActivity(intent);


 //接收頁面
  protected void onCreate(Bundle savedInstanceState){

   //savedInstanceState.getString(key);
 
    //savedInstanceState.getInt(key);
 
    //savedInstanceState.getBundle(key);
}

    (2)擷取其它頁面的傳回值,這個需要繼承LoaderCallbacks<Cursor>介面,並重寫onActivityResult函數,這個函數第三個參數就是我們需要擷取資料的地方。

public class MainActivity extends Activity implements LoaderCallbacks<Cursor> {  ......
@Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) {    
    //擷取其它頁面傳回值
    //intent.getBooleanArrayExtra(name)
  
    //intent.getBundleExtra(name)
  
    //intent.getStringExtra(name) 
    Uri uri = intent.getData();  }}

    上面代碼 Uri uri = intent.getData();這裡調用一些系統頁面時,資料會以Uri形式返回,例如:

        //擷取音樂列表介面
     Intent intent = new Intent(); intent.setType("audio/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, 22);     //擷取相簿介面 Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, 22);

 

  3.Activity之菜單

    當我們點擊手機左下角的按鈕時,介面底部一般會彈出一個菜單,這個菜單可以從xml建立,也可以從代碼建立,以下是實現代碼:

    // 建立菜單處理    @Override    public boolean onCreateOptionsMenu(Menu menu) {        super.onCreateOptionsMenu(menu);        // 從xml建立菜單        // getMenuInflater().inflate(R.menu.main, menu);        /**        * add()方法的四個參數,依次是:          * 1、組別,如果不分組的話就寫Menu.NONE,        * 2、Id,這個很重要,Android根據這個Id來確定不同的菜單          * 3、順序,那個菜單現在在前面由這個參數的大小決定         * 4、文本,菜單的顯示文本         */        menu.add(Menu.NONE, MenuIds.PlayOrPause, 1, MenuTitles.Play);        menu.add(Menu.NONE, MenuIds.EditMusic, 2, MenuTitles.EditMusic);        menu.add(Menu.NONE, MenuIds.EditImages, 3, MenuTitles.EditImages);        return true;    }

這裡的Id跟title使用內部類定義的常量,這裡貼出來可以作為參考:

    // 定義菜單id    private static class MenuIds {        public static final int PlayOrPause = Menu.FIRST + 1;        public static final int EditMusic = Menu.FIRST + 2;        public static final int EditImages = Menu.FIRST + 3;    }    // 定義菜單顯示文本    private static class MenuTitles {        public static final CharSequence Play = "播放";        public static final CharSequence Pause = "暫停";        public static final CharSequence EditMusic = "編輯音樂";        public static final CharSequence EditImages = "編輯照片";    }

這樣就可以在按下左下角按鍵時,在底部出現系統功能表,還有一步需要做,就是點擊菜單時的事件處理:

    // 功能表項目被選擇事件    @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()) {        case MenuIds.PlayOrPause:            if (isPalying) {                Pause();            } else {                Play();            }            break;        case MenuIds.EditImages:            EditImages();            break;        case MenuIds.EditMusic:            EditMusic();            break;        }        return true;    }

另外還有幾個可以能會用到的菜單事件:

    // 建立菜單前對菜單進行處理    @Override    public boolean onPrepareOptionsMenu(Menu menu) {        MenuItem playOrPause = menu.findItem(MenuIds.PlayOrPause);        if (isPalying) {            playOrPause.setTitle("暫停");            // playOrPause.setIcon(R.drawable.pause);        } else {            playOrPause.setTitle("播放");            // playOrPause.setIcon(R.drawable.play);        }        // 如果返回false,onCreateOptionsMenu方法將不會被調用        return true;    }    // 菜單關閉時觸發    // 選項菜單被關閉事件,菜單被關閉有三種情形,    // menu按鈕被再次點擊、back按鈕被點擊或者使用者選擇了某一個功能表項目    @Override    public void onOptionsMenuClosed(Menu menu) {    }

4.Activity之布局

  做介面,不對介面控制項瞭解的爐火純青,上起手來還是會力不從心,事半功倍,做不出想要的效果。

  Android布局類型主要有四種,分別是LinearLayout(線性布局)、RelativeLayout(相對布局)、TableLayout(表格版面配置)、FrameLayout(幀布局)。

雖然這裡名字基本可以見名知義,不動動手做做,心裡還是沒有底。

  這裡網上搜到篇文章,解釋用法已經很清楚了,借用一下:http://blog.csdn.net/wyd458549392147/article/details/7051417

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.