標籤: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