標籤:android 第一行代碼 心得 技巧 超低空
學習Android開發差不多有兩年時間了,期間也做了大大小小的一些項目。近來抽出閑暇想把Android基礎強化一下,之前在網上看到了郭霖郭大神的幾篇部落格,從中受益不少。於是花了近一周時間看完了郭神的一本Android教材——《Android第一行代碼》。這本書相比其他教材個人感覺更為基礎,內容很實用。看完之後我也有一些收穫,學到了一些可以很好的運用到實際中的Android小技巧,下面從中選出我認為很有價值的地方做個記錄。同時歡迎各位指正補充~~
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()); }}
- 讓工程裡所有的Activity都繼承自BaseActivity;
- 點擊進入你想查看代碼的介面,同時觀察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
- 在廣播接收器中註冊有序廣播優先順序:
<intent-filter **android:priority="50"> ... ... <intent/> <receive/>
- 阻止廣播:abortBroadcast();
- 本地廣播:LocalBroadcastManager.sendBroadcast(intent);(無法用靜態註冊方式)
個人心得:廣播接收器是很常用的。其中有序廣播的優先順序由應用自己來定這一點讓我很詫異,那豈不是又給了應用程式漏洞可鑽?在以前應用程式要攔截簡訊都是通過設定更高的廣播優先順序,然後阻斷廣播來實現,但是在Android4.4之後,加入了預設簡訊管理功能,這使得使用者來決定誰來管理簡訊、電話本等等。看來Google也發現了這個潛在的問題。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大全
好了,以上是我在讀這本書中所收穫的一些東西,坐著提供的一些小技巧如果可以運用得當,可以很好的協助我們開發項目,提高我們的效率。今後我也會不斷加入所學的實用技巧。也歡迎大家對內容進行指正、補充。謝謝!
——超低空
《Android第一行代碼》筆記