歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 《Android第一行代碼》學習筆記

《Android第一行代碼》學習筆記

日期:2017/3/1 9:19:14   编辑:Linux編程

學習Android開發差不多有兩年時間了,期間也做了大大小小的一些項目。近來抽出閒暇想把Android基礎強化一下,之前在網上看到了郭霖郭大神的幾篇博客,從中受益不少。於是花了近一周時間看完了郭神的一本Android教材——《Android第一行代碼》。這本書相比其他教材個人感覺更為基礎,內容很實用。看完之後我也有一些收獲,學到了一些可以很好的運用到實際中的Android小技巧,下面從中選出我認為很有價值的地方做個記錄。同時歡迎各位指正補充~~

第一行代碼——Android(全書完整版)高清PDF+源碼 http://www.linuxidc.com/Linux/2015-05/117920.htm

1、查看當前界面處於哪個Activity。

很多時候當我們接手一個較為復雜的源代碼的時候,裡面會有很多個Acvitity。此時我們往往很難從中找出哪個界面對應哪個源碼,這無疑會降低我們的開發效率。下面介紹書中一個小技巧:

  1. 編寫一個新Activity如BaseActivity去繼承Activity,代碼如下:
    public  class  BaseActivity extends Activity
    {
            @Override
            protected void onCreate(Bundle savedInstanceState)
            {
                         super.onCreate(savedInstanceState);
                         Log.d("BaseActivity", getClass().getSimpleName());
            }
    }
  2. 讓工程裡所有的Activity都繼承自BaseActivity;
  3. 點擊進入你想查看代碼的界面,同時觀察LogCat中的輸出,打印出的信息就是相應的Activity的類名了。

個人心得:看到這裡,也許你會覺得,如果拿到一個源碼工程,然後進去一個個的改還是會很麻煩。我認為作者在這裡主要是想介紹這樣一種方法,我們在編程的時候可以考慮加入這樣一種技巧,這樣可以更好的與人合作一個項目。

2、當啟動一個需要傳遞數據的Activity時,避免參數混淆。

大家對Intent的都很熟悉,他是Android系統的搬運工。當我們啟動一個Acivity並希望向它傳遞一些數據,這時候通常都會用到intent。
一個項目中可能會有很多個Activity都需要傳遞數據,而開發者完全有可能不確定這些Activity分別要傳遞什麼數據,這時候我們可以用一個技巧來規范這樣一種“通信協議”。

public class AnotherActivity extends BaseActivity
{
        public static void actionStart(Context context,String val1,String val2)
        {
                  Intent intent = new Intent(context, AnotherActivity.class);
                  intent.putExtra("val1", val1);
                  intent.putExtra("val2", val2);
                  context.startActivity(intent);
        }
}

這樣一來,在使用的過程中,當需要跳轉的時候可以用以下代碼

AnotherActivity.actionStart(FirstActivity.this, "val1", "val2");

個人心得:個人覺得這是一個很不錯的習慣,如果系統中帶參數的跳轉比較多就應該將跳轉全部換成統一規范,這樣可以減少合作開發中不必要的麻煩。

3、TableLayout的使用

TableLayout是在開發中很少用到的一個布局。當然對於這個控件有幾個地方我覺得也需要注意。

  • TableRow標簽(TableLayout的一行)中的控件是不能指定寬度的。
  • 正由於TableRow不能設置寬度當需要布局自動拉伸寬度時,可以通過在TableLayout標簽下設置
    android:stretchColunms="1"
    屬性來指定某一列被拉伸解決(以上是指定拉伸第二列)。
  • 當某一行少一列數據的時候,最後會多出一列的空白。如果希望系統自動拉伸空間占滿這一行,可以在當前行的某個控件標簽下設置:
    android:layout_span="2"
    這樣一來該控件就會占2個位置。

個人心得:在我所做過的項目中,尚未用過TableLayout,不過作為一個Android開發者,應該對其有一定的了解,在恰當的時候能夠很好的使用之。

4、自定義繼承ArrayAdapter的適配器

我們在用listview的時候都會用到適配器,Android為我們做了兩個常用的適配器:SimpleAdapter和ArrayAdapter等,當我們有特殊要求的時候需要自定義一個適配器繼承自BaseAdapter,這樣可以更加靈活的完成我們需要的特殊功能。但其實大多時候我們可以編寫一個繼承自ArrayAdapter的適配器,這樣更加簡單:

public class MCAdapter extends ArrayAdapter<Fruit>
 {

    private int resourceId;

    public FruitAdapter(Context context, int textViewResourceId,
            List<Fruit> objects) {
        super(context, textViewResourceId, objects);
        resourceId = textViewResourceId;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ... ...
        return view;
    }

這樣一來,我們只需要重寫getView這樣一個方法,而如果是繼承自BaseAdapter,我們需要至少重寫4個方法。可以是我們的代碼更加簡化。
個人心得:也許這個大家都知道吧, 反正我以前都是自定義適配器繼承自BaseAdapter,然後重寫4個方法,其中3個都是用不上的。。

5、Fragment回退棧

這裡只是想記錄一個Fragment的方法:transaction.addToBackStack(null);

6、Broadcast Receiver

  • 廣播接收器類中不允許開啟線程
  • 發送有序廣播:sendOrderedBroadcast
  • 在廣播接收器中注冊有序廣播優先級:
    ```<receive android:name=".MC>
            <intent-filter **android:priority="50">
            ... ...
            <intent/>
    <receive/>
    ```
  • 阻止廣播:abortBroadcast();
  • 本地廣播:LocalBroadcastManager.sendBroadcast(intent);(無法用靜態注冊方式)
    個人心得:廣播接收器是很常用的。其中有序廣播的優先級由應用自己來定這一點讓我很詫異,那豈不是又給了應用程序漏洞可鑽?在以前應用程序要攔截短信都是通過設置更高的廣播優先級,然後阻斷廣播來實現,但是在Android4.4之後,加入了默認短信管理功能,這使得用戶來決定誰來管理短信、電話本等等。看來谷歌也發現了這個潛在的問題。

7、調用系統相機

在使用系統相機的過程中,我們可以通過startActivityForResult啟動相機,從而接收拍照成功與否的返回值。並且可以對拍照後的圖片進行裁剪。

  • 啟動相機拍照:
    Intent intent = new intent("android.media.action.IMAGE_CAPTURE");
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    startActivityForResult(intent, TAKE_PHOTO);
  • 拍照完成後裁剪:
    Intent intent = new intent("android.media.action.CROP");
    intent.setDataAndType(imageUri, "image/*");
    intent.putExtra("scale", true);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    startActivityForResult(intent, CROP_PHOTO);
    個人心得:這裡主要是對系統中的action的了解程度以及對action的參數的熟悉。詳見Android action大全

8、Android位置服務

書中的這一章主要分為兩個部分:1、通過Android系統API獲取本機位置信息;2、通過調用百度地圖顯示地圖信息。前者是Android自帶的函數,而後者需要下載百度API。
對於第一部分Android API沒有任何變化,而第二部分書中是用的百度地圖2.3版,而在我寫這篇文章的時候百度地圖最新版是3.2。很多函數已經不再適用,所以這一章的內容基本可以忽略了。大家可以按照需求照著百度文檔來學習這一部分內容:百度地圖文檔。

個人心得:雖然書上的程序已經不能使用,但是作為了解,個人覺��照著百度文檔實現書中的內容也是很有必要的,而且用起來也很簡單。至於更多復雜的高級功能大家到用到的時候在學不遲,也會學的更快一些。

好了,以上是我在讀這本書中所收獲的一些東西,坐著提供的一些小技巧如果可以運用得當,可以很好的幫助我們開發項目,提高我們的效率。今後我也會不斷加入所學的實用技巧。也歡迎大家對內容進行指正、補充。謝謝!

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved