學習Android開發差不多有兩年時間了,期間也做了大大小小的一些項目。近來抽出閑暇想把Android基礎強化一下,之前在網上看到了郭霖郭大神的幾篇博客,從中受益不少。于是花了近一周時間看完了郭神的一本Android教材——《Android第一行代碼》。這本書相比其他教材個人感覺更為基礎,內容很實用。看完之后我也有一些收獲,學到了一些可以很好的運用到實際中的Android小技巧,下面從中選出我認為很有價值的地方做個記錄。同時歡迎各位指正補充~~
1、查看當前界面處于哪個Activity。
很多時候當我們接手一個較為復雜的源代碼的時候,里面會有很多個Acvitity。此時我們往往很難從中找出哪個界面對應哪個源碼,這無疑會降低我們的開發效率。下面介紹書中一個小技巧:
- 編寫一個新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之后,加入了默認短信管理功能,這使得用戶來決定誰來管理短信、電話本等等。看來谷歌也發現了這個潛在的問題。
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。很多函數已經不再適用,所以這一章的內容基本可以忽略了。大家可以按照需求照著百度文檔來學習這一部分內容:百度地圖文檔。
個人心得:雖然書上的程序已經不能使用,但是作為了解,個人覺得照著百度文檔實現書中的內容也是很有必要的,而且用起來也很簡單。至于更多復雜的高級功能大家到用到的時候在學不遲,也會學的更快一些。
好了,以上是我在讀這本書中所收獲的一些東西,坐著提供的一些小技巧如果可以運用得當,可以很好的幫助我們開發項目,提高我們的效率。今后我也會不斷加入所學的實用技巧。也歡迎大家對內容進行指正、補充。謝謝!
——超低空