第一章
不同于eclipse吸耿,AS的方便的地方就是谷歌已經(jīng)將東西都集成好了氓癌,例如JDK和安卓的SDK绒障,之前看過(guò)一會(huì)第一版用eclipse的時(shí)候就踩了挺多的坑,于是果斷轉(zhuǎn)向第二版酝碳。接下來(lái)是我在看第一章的時(shí)候遇到的坑已經(jīng)一些感想和筆記矾踱。
下載的話介返,途徑很多,可以官網(wǎng),不過(guò)需要翻墻圣蝎。需要科學(xué)上網(wǎng)刃宵。不想去官網(wǎng)的話,不妨下我云盤里面的
鏈接:https://pan.baidu.com/s/1HInD24u62j0GNUG2TIGwUw 密碼:c3wh
下載后安裝的一些細(xì)節(jié)我就不贅述了徘公。按照作者的步驟牲证,讀到這里應(yīng)該是不會(huì)報(bào)錯(cuò)的。但我在這里遇到了一個(gè)問(wèn)題关面,我發(fā)現(xiàn)
@override
這一行下面會(huì)有紅線坦袍,顯示有錯(cuò)誤,下面還有相關(guān)信息
Failed to resolve:com.android.support:appcompat-v7.....
我剛開始以為是我環(huán)境沒(méi)裝好等太,或者是SDK版本還沒(méi)有下完全捂齐,于是重新安裝AS,還是沒(méi)能解決缩抡,最后在某個(gè)大神的博客中找到了答案
https://blog.csdn.net/mhl18820672087/article/details/78385361
2奠宜,@override,這個(gè)代表重寫瞻想,作用如下
1压真,當(dāng)注釋用,方便閱讀
2蘑险,編譯器會(huì)檢測(cè)你下面的代碼滴肿,如果不是父類中的方法會(huì)報(bào)錯(cuò)
3,創(chuàng)建虛擬機(jī)時(shí)佃迄,顯示VT-X is disabled in BIOS
Windows默認(rèn)的時(shí)不支持處理器虛擬化的泼差,所以你需要進(jìn)入BIOS將CPU虛擬化打開,進(jìn)BIOS和屎,這個(gè)不同的電腦進(jìn)入方法不同拴驮,我的惠普時(shí)開機(jī)點(diǎn)幾下F10,具體的百度吧柴信。之后,在把
這個(gè)選項(xiàng)下下來(lái)就ok了宽气,就可以創(chuàng)建虛擬機(jī)了
4随常,學(xué)會(huì)用log打印日志信息,不是用System.ou.printn("******");
因?yàn)镴ava的緣故萄涯,我之前認(rèn)為的輸出也這么簡(jiǎn)單绪氛,然而看了大神的書,才知道這個(gè)除了方便什么其他好處涝影,因?yàn)槭褂肧ystem.out.println();不能使用過(guò)濾器枣察,日志沒(méi)有級(jí)別之分等等,總之,用log就對(duì)了序目。臂痕。。
第二章
生命周期:
防止數(shù)據(jù)得不到保存:
利用onSaveInstanceState()猿涨,他可以保證活動(dòng)在回收前一定會(huì)被調(diào)用握童,然后,通過(guò)onCreate方法中的Buntle類型的參數(shù)來(lái)取出數(shù)據(jù)
利用toast可以向用戶提示一下信息叛赚,常見(jiàn)格式為Toast.makeText(testActivity.this,"You clicked it",Toast.LENGTH_LONG).show();
第一個(gè)參數(shù)是Toast要求的上下文(我還不是很懂)澡绩,第二個(gè)參數(shù)是提示的信息內(nèi)容,第三個(gè)是顯示這個(gè)提醒的時(shí)間長(zhǎng)短(取值可以為L(zhǎng)ENGTH_LONG或者LENGTH_SHORT)
啟動(dòng)模式:分為standard俺附,singleTop肥卡,singleTask,singleInstance
默認(rèn)的模式為standard事镣,安卓是使用棧來(lái)管理活動(dòng)的召调。
standard:默認(rèn)情況下,每啟動(dòng)一個(gè)活動(dòng)蛮浑,就會(huì)新建一個(gè)實(shí)例唠叛,入棧,并且處于棧頂?shù)奈恢镁谥桑到y(tǒng)不在乎這個(gè)活動(dòng)在棧中是否存在艺沼。
singleTop:?jiǎn)?dòng)同一個(gè)活動(dòng)并且活動(dòng)在棧頂?shù)臅r(shí)候都會(huì)直接使用棧頂?shù)幕顒?dòng),而不是新建一個(gè)實(shí)例
singleTask:每次啟動(dòng)時(shí)系統(tǒng)會(huì)先檢查棧中是否存在該活動(dòng)的一個(gè)實(shí)例蕴掏,如存在障般,則將火種之上是所有活動(dòng)統(tǒng)統(tǒng)出棧(銷毀),沒(méi)有則創(chuàng)建一個(gè)新的活動(dòng)
singleInstance: 是創(chuàng)建一個(gè)新的棧來(lái)管理這個(gè)活動(dòng)
第三章:
這本書里講到的界面設(shè)計(jì)都是用最基本的方式實(shí)現(xiàn)的,即編寫xml文件
所有的控件都具有寬度和高度屬性,即android:layout_width和android:layout_height,這兩個(gè)屬性對(duì)應(yīng)的值有三個(gè),分別為wrap_content和match_parent和fill_parent,后兩個(gè)的意義相同,都表示和父類控件的屬性相同,前面那個(gè)則表示控件剛好包好里面的內(nèi)容,即內(nèi)容決定控件大小.
TextView,是最簡(jiǎn)單的一種控件,用于界面上顯示一些信息Button,顧名思義,表示按鈕,屬性與TextView基本相同,可以利用textAllCaps來(lái)對(duì)按鈕上的字的字母大小寫進(jìn)行設(shè)置EditText,用于輸入和編輯內(nèi)容,比如QQ發(fā)信息,是用戶交互中一個(gè)很重要的控件,重要屬性:maxlines,通過(guò)他來(lái)限制輸入的最大行數(shù),防止不斷被拉長(zhǎng)ImageView,展示圖片的控件,圖片通常放在drawable目錄當(dāng)中,屬性跟前面大致相同ProgressBar,在界面上展示一個(gè)進(jìn)度條,用來(lái)表示程序加載進(jìn)度,可以通過(guò)android:visibility來(lái)控制其可見(jiàn)性,有visible,invisible,gone三個(gè)值A(chǔ)lertDialog,用于彈出對(duì)話框,并且這個(gè)框可以屏蔽屏幕上各個(gè)控件的交互能力,一般用于提示警告信息ProcessDialog,跟上面AlertDialog類似,都是彈出對(duì)話框并屏蔽其他控件,不同的是它顯示的是進(jìn)度條
自定義控件其實(shí)也就是重寫一個(gè)類,繼承已有的類,然后再繼續(xù)編寫,這樣就能減少重復(fù)的代碼,這里著重要說(shuō)的應(yīng)該是適配器的使用,這里是鑲嵌在ListView里面講的,為什么講ListView要說(shuō)適配器.ListView是用來(lái)展示大量數(shù)據(jù)的,但是例如一個(gè)數(shù)組,里面的數(shù)據(jù)是不能直接傳遞給ListView我們需要借助適配器來(lái)完成,我簡(jiǎn)單理解為一個(gè)盒子,這樣我們就可以將東西裝在盒子里面然后裝上貨車,而不是把東西直接放上貨車
ListView性能優(yōu)化,ListView很難用的原因之一就是它有很多地方可以優(yōu)化,就例如在這個(gè)方法中
這里每次調(diào)用這個(gè)函數(shù)的時(shí)候,不管他里面有沒(méi)有元素,都會(huì)講布局重新加載一遍,這樣,當(dāng)布局的數(shù)量逐漸多起來(lái)并且快速滑動(dòng)的時(shí)候,時(shí)間復(fù)雜度也會(huì)跟著上來(lái),所以這里還有優(yōu)化的空間,而切入點(diǎn)就從加載布局這里下手,我們?cè)O(shè)置一個(gè)判斷條件,如果調(diào)用這個(gè)函數(shù)的時(shí)候,convertView這個(gè)外部變量里面沒(méi)有元素,則加載布局,否則不加載,這樣就在一定程度上提高了性能
書中還講到的一個(gè)優(yōu)化的地方便是建一個(gè)緩存了,用來(lái)存放加載完成的控件的實(shí)例,放在我們自己定義的ViewHolder類里面,這樣在convertView不為空的時(shí)候,通過(guò)getTag取出,避免每次都用findViewById()來(lái)找布局了
最后說(shuō)一說(shuō)
不詳細(xì)講用法什么的了,講一講需要注意的地方,之前做那個(gè)聊天界面的時(shí)候,我的程序程序總是只能顯示輸入框,然而卻沒(méi)
沒(méi)有出來(lái)信息,我找遍了整個(gè)程序,好吧再?gòu)?qiáng)的大腦也不能媲美編譯器,最后繳械投降,我再自定義布局的函數(shù)里都加了一句Log.d("#####","####"),來(lái)看著部分代碼有沒(méi)有執(zhí)行,類似這樣
點(diǎn)一下按鈕就看一下日志,最后發(fā)現(xiàn)是onCreateVieHolder那個(gè)函數(shù)壓根沒(méi)有調(diào)用,最后各種找教程我找到了幾個(gè)原因,這里也體現(xiàn)了log的作用了
onCreateViewHolder沒(méi)有加載有以下四種可能
1,沒(méi)有用layoutManager
2,沒(méi)有用scrollView嵌套R(shí)ecyclerView,這個(gè)其實(shí)問(wèn)題不大,但聽網(wǎng)上大牛說(shuō)在某些版本里面不嵌套不行
3,getItemCount這個(gè)函數(shù)返回非正數(shù),返回負(fù)數(shù)和0是不能顯示出的
4,最外層的LinearLayout的屬性里沒(méi)有設(shè)置orientation,并且要定為"vertical",這樣才能加載出來(lái)
第五章
參考博客:https://blog.csdn.net/chuyouyinghe/article/details/79424373
照著書上的源碼將程序原封不動(dòng)敲了一遍,但發(fā)現(xiàn)這特么怎么也收不到發(fā)出的廣播
<receiver android:name=".MyBroadCastReceiver"
android:permission="com.example.Broadcasttest.MY_BROADCAST">
<intent-filter>
<action android:name="com.example.Broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
</application>
如上代碼,我在manifest中也注冊(cè)了
再看這里
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent intent =new Intent();
intent.setAction("com.example.Broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
}
});
心里當(dāng)時(shí)一萬(wàn)個(gè)草泥馬路過(guò),我在自定義的廣播接收類里面的onReceive里面用Log打印了信息,發(fā)現(xiàn)這個(gè)函數(shù)壓根就沒(méi)有運(yùn)行,于是我上網(wǎng)百度了一波.不得不說(shuō)這個(gè)地方還是相當(dāng)?shù)目拥?/p>
因?yàn)?我用的虛擬機(jī)的安卓版本是8.0,但是,8.0,取消了大部分靜態(tài)注冊(cè)!!!
一般來(lái)說(shuō),出現(xiàn)自定義的廣播接收器接收不到信息的原因,有如下幾個(gè)
1,Manifest里面沒(méi)有注冊(cè)
2,注冊(cè)了但是Action里面那個(gè)android:name與Intent.setAction()的參數(shù)不匹配
3,就是系統(tǒng)的原因了,前兩個(gè)一般設(shè)置代碼跟蹤可以找得出,但第三個(gè)一般不容易,只能上網(wǎng)查一查了
所以這里這個(gè)問(wèn)題的解決辦法就只能是將虛擬機(jī)的安卓版本調(diào)低一點(diǎn).好像是7.0以下都能