學(xué)習(xí)Android開發(fā)差不多有兩年時(shí)間了泽论,期間也做了大大小小的一些項(xiàng)目夺蛇。近來(lái)抽出閑暇想把Android基礎(chǔ)強(qiáng)化一下步做,之前在網(wǎng)上看到了郭霖郭大神的幾篇博客副渴,從中受益不少。于是花了近一周時(shí)間看完了郭神的一本Android教材——《Android第一行代碼》全度。這本書相比其他教材個(gè)人感覺更為基礎(chǔ)煮剧,內(nèi)容很實(shí)用〗遥看完之后我也有一些收獲勉盅,學(xué)到了一些可以很好的運(yùn)用到實(shí)際中的Android小技巧,下面從中選出我認(rèn)為很有價(jià)值的地方做個(gè)記錄咨堤。同時(shí)歡迎各位指正補(bǔ)充~~
1菇篡、查看當(dāng)前界面處于哪個(gè)Activity漩符。
很多時(shí)候當(dāng)我們接手一個(gè)較為復(fù)雜的源代碼的時(shí)候一喘,里面會(huì)有很多個(gè)Acvitity。此時(shí)我們往往很難從中找出哪個(gè)界面對(duì)應(yīng)哪個(gè)源碼,這無(wú)疑會(huì)降低我們的開發(fā)效率凸克。下面介紹書中一個(gè)小技巧:
- 編寫一個(gè)新Activity如BaseActivity去繼承Activity议蟆,代碼如下:
public class BaseActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
}
}
- 讓工程里所有的Activity都繼承自BaseActivity;
- 點(diǎn)擊進(jìn)入你想查看代碼的界面萎战,同時(shí)觀察LogCat中的輸出咐容,打印出的信息就是相應(yīng)的Activity的類名了。
個(gè)人心得:看到這里蚂维,也許你會(huì)覺得戳粒,如果拿到一個(gè)源碼工程,然后進(jìn)去一個(gè)個(gè)的改還是會(huì)很麻煩虫啥。我認(rèn)為作者在這里主要是想介紹這樣一種方法蔚约,我們?cè)诰幊痰臅r(shí)候可以考慮加入這樣一種技巧,這樣可以更好的與人合作一個(gè)項(xiàng)目涂籽。
2苹祟、當(dāng)啟動(dòng)一個(gè)需要傳遞數(shù)據(jù)的Activity時(shí),避免參數(shù)混淆评雌。
大家對(duì)Intent的都很熟悉树枫,他是Android系統(tǒng)的搬運(yùn)工。當(dāng)我們啟動(dòng)一個(gè)Acivity并希望向它傳遞一些數(shù)據(jù)景东,這時(shí)候通常都會(huì)用到intent砂轻。
一個(gè)項(xiàng)目中可能會(huì)有很多個(gè)Activity都需要傳遞數(shù)據(jù),而開發(fā)者完全有可能不確定這些Activity分別要傳遞什么數(shù)據(jù)斤吐,這時(shí)候我們可以用一個(gè)技巧來(lái)規(guī)范這樣一種“通信協(xié)議”舔清。
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);
}
}
這樣一來(lái),在使用的過程中曲初,當(dāng)需要跳轉(zhuǎn)的時(shí)候可以用以下代碼
AnotherActivity.actionStart(FirstActivity.this, "val1", "val2");
個(gè)人心得:個(gè)人覺得這是一個(gè)很不錯(cuò)的習(xí)慣体谒,如果系統(tǒng)中帶參數(shù)的跳轉(zhuǎn)比較多就應(yīng)該將跳轉(zhuǎn)全部換成統(tǒng)一規(guī)范,這樣可以減少合作開發(fā)中不必要的麻煩臼婆。
3抒痒、TableLayout的使用
TableLayout是在開發(fā)中很少用到的一個(gè)布局。當(dāng)然對(duì)于這個(gè)控件有幾個(gè)地方我覺得也需要注意颁褂。
- TableRow標(biāo)簽(TableLayout的一行)中的控件是不能指定寬度的故响。
- 正由于TableRow不能設(shè)置寬度當(dāng)需要布局自動(dòng)拉伸寬度時(shí),可以通過在TableLayout標(biāo)簽下設(shè)置
android:stretchColunms="1"
屬性來(lái)指定某一列被拉伸解決(以上是指定拉伸第二列)颁独。
- 當(dāng)某一行少一列數(shù)據(jù)的時(shí)候彩届,最后會(huì)多出一列的空白。如果希望系統(tǒng)自動(dòng)拉伸空間占滿這一行誓酒,可以在當(dāng)前行的某個(gè)控件標(biāo)簽下設(shè)置:
android:layout_span="2"
這樣一來(lái)該控件就會(huì)占2個(gè)位置樟蠕。
個(gè)人心得:在我所做過的項(xiàng)目中贮聂,尚未用過TableLayout,不過作為一個(gè)Android開發(fā)者寨辩,應(yīng)該對(duì)其有一定的了解吓懈,在恰當(dāng)?shù)臅r(shí)候能夠很好的使用之。
4靡狞、自定義繼承ArrayAdapter的適配器
我們?cè)谟胠istview的時(shí)候都會(huì)用到適配器耻警,Android為我們做了兩個(gè)常用的適配器:SimpleAdapter和ArrayAdapter等,當(dāng)我們有特殊要求的時(shí)候需要自定義一個(gè)適配器繼承自BaseAdapter甸怕,這樣可以更加靈活的完成我們需要的特殊功能甘穿。但其實(shí)大多時(shí)候我們可以編寫一個(gè)繼承自ArrayAdapter的適配器,這樣更加簡(jiǎn)單:
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;
}
這樣一來(lái)梢杭,我們只需要重寫getView這樣一個(gè)方法扒磁,而如果是繼承自BaseAdapter,我們需要至少重寫4個(gè)方法式曲》镣校可以是我們的代碼更加簡(jiǎn)化。
個(gè)人心得:也許這個(gè)大家都知道吧吝羞, 反正我以前都是自定義適配器繼承自BaseAdapter兰伤,然后重寫4個(gè)方法,其中3個(gè)都是用不上的钧排。敦腔。
5、Fragment回退棧
這里只是想記錄一個(gè)Fragment的方法:transaction.addToBackStack(null);
6恨溜、Broadcast Receiver
- 廣播接收器類中不允許開啟線程
- 發(fā)送有序廣播:sendOrderedBroadcast
- 在廣播接收器中注冊(cè)有序廣播優(yōu)先級(jí):
<intent-filter **android:priority="50">
... ...
<intent/>
<receive/>
- 阻止廣播:abortBroadcast();
- 本地廣播:LocalBroadcastManager.sendBroadcast(intent);(無(wú)法用靜態(tài)注冊(cè)方式)
個(gè)人心得:廣播接收器是很常用的符衔。其中有序廣播的優(yōu)先級(jí)由應(yīng)用自己來(lái)定這一點(diǎn)讓我很詫異,那豈不是又給了應(yīng)用程序漏洞可鉆糟袁?在以前應(yīng)用程序要攔截短信都是通過設(shè)置更高的廣播優(yōu)先級(jí)判族,然后阻斷廣播來(lái)實(shí)現(xiàn),但是在Android4.4之后项戴,加入了默認(rèn)短信管理功能形帮,這使得用戶來(lái)決定誰(shuí)來(lái)管理短信、電話本等等周叮”绯牛看來(lái)谷歌也發(fā)現(xiàn)了這個(gè)潛在的問題。
7仿耽、調(diào)用系統(tǒng)相機(jī)
在使用系統(tǒng)相機(jī)的過程中合冀,我們可以通過startActivityForResult啟動(dòng)相機(jī),從而接收拍照成功與否的返回值项贺。并且可以對(duì)拍照后的圖片進(jìn)行裁剪君躺。
- 啟動(dòng)相機(jī)拍照:
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);
個(gè)人心得:這里主要是對(duì)系統(tǒng)中的action的了解程度以及對(duì)action的參數(shù)的熟悉峭判。詳見Android action大全
8、Android位置服務(wù)
書中的這一章主要分為兩個(gè)部分:1晰洒、通過Android系統(tǒng)API獲取本機(jī)位置信息;2啥箭、通過調(diào)用百度地圖顯示地圖信息谍珊。前者是Android自帶的函數(shù),而后者需要下載百度API急侥。
對(duì)于第一部分Android API沒有任何變化砌滞,而第二部分書中是用的百度地圖2.3版,而在我寫這篇文章的時(shí)候百度地圖最新版是3.2坏怪。很多函數(shù)已經(jīng)不再適用贝润,所以這一章的內(nèi)容基本可以忽略了。大家可以按照需求照著百度文檔來(lái)學(xué)習(xí)這一部分內(nèi)容:百度地圖文檔铝宵。
個(gè)人心得:雖然書上的程序已經(jīng)不能使用打掘,但是作為了解,個(gè)人覺得照著百度文檔實(shí)現(xiàn)書中的內(nèi)容也是很有必要的鹏秋,而且用起來(lái)也很簡(jiǎn)單尊蚁。至于更多復(fù)雜的高級(jí)功能大家到用到的時(shí)候在學(xué)不遲,也會(huì)學(xué)的更快一些侣夷。
好了横朋,以上是我在讀這本書中所收獲的一些東西,坐著提供的一些小技巧如果可以運(yùn)用得當(dāng)百拓,可以很好的幫助我們開發(fā)項(xiàng)目琴锭,提高我們的效率。今后我也會(huì)不斷加入所學(xué)的實(shí)用技巧衙传。也歡迎大家對(duì)內(nèi)容進(jìn)行指正决帖、補(bǔ)充。謝謝蓖捶!
——超低空