Android開發(fā)筆記

/* M式編程@小目標 */

### M式編程規(guī)范

步驟:1.理清需求 2.設計數(shù)據(jù)結構和算法 3.對算法進行M化.

& 設計數(shù)據(jù)結構包括類的設計枫浙,數(shù)據(jù)庫的設計,接口的設計等甥桂;

& 算法是解決問題的各種策略,可借助于數(shù)學等各學科知識圣拄;

& 代碼要求:函數(shù)粒度不超過20行,高內聚穆刻,低耦合始花。

=======================================================

### Android Studio編譯優(yōu)化

$ studio.vmoptions

-Xms512m

-Xmx4096m

-XX:MaxPermSize=2048m

-XX:+HeapDumpOnOutOfMemoryError

-Dfile.encoding=UTF-8

$ gradle.properties

#開啟守護進程

org.gradle.damen=true

##開啟并行編譯

org.gradle.parallel=true

##啟用新的孵化模式

org.gradle.configureondemand=true

##配置編譯時的虛擬機大小

org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

$ 編譯設置項

### 旋轉動畫

RotateAnimation ra = new RotateAnimation(

0f, -180f, // 開始, 結束的角度, 逆時針

Animation.RELATIVE_TO_SELF, 0.5f,? // 相對的x坐標點(指定旋轉中心x值)

Animation.RELATIVE_TO_SELF, 1.0f); // 相對的y坐標點(指定旋轉中心y值)

ra.setDuration(500);

ra.setFillAfter(true); // 設置動畫停留在結束位置

ra.setStartOffset(delay); // 設置動畫開始延時

ra.setAnimationListener(new MyAnimationListener()); // 添加監(jiān)聽

layout.startAnimation(ra);


### 文件操作

// 保存數(shù)據(jù)

File file = new File("/data/data/com.itheima.login/info.txt");

FileOutputStream fos = new FileOutputStream(file);

String info = qq + "##"+ pwd;

fos.write(info.getBytes());

fos.close();

// 讀取數(shù)據(jù)

File file = new File("/data/data/com.itheima.login/files/info.txt");

FileReader fr = new FileReader(file);

BufferedReader br = new BufferedReader(fr);

String info = br.readLine();

### Android Studio運行加速和優(yōu)化

& 修改此文件: studio64.vmoptions

-Xms2048m??

-Xmx2048m??

-XX:MaxPermSize=2048m??

-XX:ReservedCodeCacheSize=1024m?


### MVP模式詳解

MVP(Model-View-Presenter,模型-視圖-表示器)模式則是由IBM開發(fā)出來的一個針對C++和Java的編程模型趋惨,大概出現(xiàn)于2000年鸟顺,是MVC模式的一個變種,主要用來隔離UI器虾、UI邏輯和業(yè)務邏輯讯嫂、數(shù)據(jù)。也就是說兆沙,MVP 是從經(jīng)典的模式MVC演變而來欧芽,它們的基本思想有相通的地方:Controller/Presenter負責邏輯的處理,Model提供數(shù)據(jù)葛圃,View負責顯示千扔。

(1) View :負責繪制UI元素憎妙、與用戶進行交互(在Android中體現(xiàn)為Activity);

(2) View interface :需要View實現(xiàn)的接口,View通過View interface與Presenter進行交互曲楚,降低耦合厘唾,方便進行單元測試;

(3) Model :負責存儲、檢索龙誊、操縱數(shù)據(jù)(有時也實現(xiàn)一個Model interface用來降低耦合);

(4) Presenter :作為View與Model交互的中間紐帶抚垃,處理與用戶交互的負責邏輯。

### EventBus

EventBus是由greenrobot 組織貢獻的一個Android事件發(fā)布/訂閱輕量級框架趟大。EventBus是一個Android端優(yōu)化的publish/subscribe消息總線鹤树,簡化了應用程序內各組件間、組件與后臺線程間的通信逊朽。比如請求網(wǎng)絡魂迄,等網(wǎng)絡返回時通過Handler或Broadcast通知UI,兩個Fragment之間需要通過Listener通信惋耙,這些需求都可以通過EventBus實現(xiàn)捣炬。

發(fā)布消息:EventBus.getDefault().post(new MessageEvent(“name”,”password”));

接收消息:可以有四種線程模型選擇

@Subscribe(threadMode = ThreadMode.MAIN)

public void messageEventBus(MessageEvent event){

? ? tv_result.setText("name:"+event.name+" passwrod:"+event.password);

}

### RxAndroid教程

RxJava最核心的兩個東西是Observables(被觀察者,事件源)和Subscribers(訂閱者)绽榛。Observables發(fā)出一系列事件湿酸,Subscribers處理這些事件。這里的事件可以是任何你感興趣的東西灭美,觸摸事件推溃,web接口調用返回的數(shù)據(jù)等等。

在觀察者模式中届腐,必須實現(xiàn)兩個關鍵的 RxJava 接口:觀察者 Observer 和被觀察者 Observable铁坎。當被觀察者的狀態(tài)改變,所有訂閱了的觀察者對象都會被通知犁苏。

Observable 接口有一個 subscribe() 方法硬萍,每個觀察者調用這個方法來訂閱通知。?

在 Observer 接口中有 3 個方法會被 Observable 調用:

onNext(T value) 方法:提供一個類型為 T 的新對象給觀察者

onComplete() 方法:當被觀察者發(fā)送完這個對象之后通知給觀察者围详。

onError(Throwable e) 方法:通知觀察者被觀察者發(fā)生了一個錯誤朴乖。


### Otto使用姿勢

Android事件總線,使用這個庫可實現(xiàn)組件之間的通信.

Bus?– 管理注冊、注銷和發(fā)布事件

@Produce?– 標記該方法是生產者助赞,產生的事件內容為該方法的返回值

@Subscribe?– 標記該方法是訂閱者买羞,表示訂閱了一個事件,方法需要修飾符為public雹食,而區(qū)分不同的訂閱者是通過方法的參數(shù)來區(qū)分的畜普,且訂閱了某事件的所有訂閱者都可以收到該事件

register(Object obj)?– 注冊,訂閱事件前都需要注冊

unregister(Object obj)?– 注銷群叶,放棄之前所有事件的訂閱

post(Object event)?– 發(fā)布一個事件吃挑,這個事件會被所有標記了@Subscribe注解的方法獲得


### GreenDAO的使用

GreenDAO是一個開源的安卓ORM框架钝荡,能夠使SQLite數(shù)據(jù)庫的開發(fā)再次變得有趣。它減輕開發(fā)人員處理低級數(shù)據(jù)庫需求儒鹿,同時節(jié)省開發(fā)時間。 SQLite是一個令人敬畏的內嵌的關系數(shù)據(jù)庫几晤,編寫SQL和解析查詢結果是相當乏味和耗時的任務约炎。通過將Java對象映射到數(shù)據(jù)庫表(稱為ORM,“對象/關系映射”)蟹瘾,GreenDAO可以將它們從這些映射中釋放出來圾浅,這樣,您可以使用簡單的面向對象的API來存儲憾朴,更新狸捕,刪除和查詢數(shù)據(jù)庫。

簡單的講众雷,GreenDAO 是一個將對象映射到 SQLite 數(shù)據(jù)庫中的輕量且快速的 ORM 解決方案灸拍。

關鍵步驟:創(chuàng)建好@Entity注解的實體類后,在Gradle中找到greendao<腳本>并且build,程序將會對實體代碼進行標準化.

會自動創(chuàng)建下面三個類在你指定的包下面: <真幾巴強大,簡直受不了!!!>

DaoMaster: 定義了數(shù)據(jù)庫創(chuàng)建和操作的方法。

DaoSession: 提供用于訪問數(shù)據(jù)庫的 DAO 類砾省。

UserDao: 封裝用戶表鸡岗,并為其定義查詢等操作。

& 插入一條數(shù)據(jù)

mDaoSession = new DaoMaster(new DaoMaster.DevOpenHelper(this,DATABASE_NAME).getWritableDb()).newSession();

UserBean userBean = new UserBean(1L,"cmc","123456",24);

mDaoSession.getUserBeanDao().insert(userBean);


### FastJson操作數(shù)據(jù)

//將對象轉為json串7 String json=JSON.toJSONString(student);8 Log.e("ObjectToJson",json);

//將json轉為對象 參數(shù)1json? 參數(shù)2對象類型2 Student student=JSON.parseObject(json,Student.class);

只有一句話 就完成了 簡單到爆有沒有 ? 感謝馬云粑粑1嘈帧P浴!

### okhttp使用指南

在使用OKHttp之前狠鸳,首先要先了解如下幾個比較核心的類:

OkHttpClient:客戶端對象

Request:訪問請求揣苏,Post請求中需要包含RequestBody

RequestBody:請求數(shù)據(jù),在Post請求中用到

Response:即網(wǎng)絡請求的響應結果

MediaType:數(shù)據(jù)類型件舵,用來表明數(shù)據(jù)是json卸察,image,pdf等一系列格式

client.newCall(request).execute():同步的請求方法

client.newCall(request).enqueue(Callback callBack):異步的請求方法铅祸,但Callback是執(zhí)行在子線程中的蛾派,因此不能在此進行UI更新操作

public void okhttp_get(){

? ? final Request request = new Request.Builder().url("http://www.baidu.com").get().build();

? ? okHttpClient.newCall(request).enqueue(new Callback() {

? ? ? ? @Override

? ? ? ? public void onFailure(Call call, IOException e) {

? ? ? ? ? ? Log.e("okhttp-GET","網(wǎng)絡請求失敗");

? ? ? ? }

? ? ? ? @Override

? ? ? ? public void onResponse(Call call, Response response) throws IOException {

? ? ? ? ? ? Log.i("success",response.body().toString());

? ? ? ? }

? ? });

}

### Android Service使用詳解

Service是Android系統(tǒng)中的四大組件之一,主要有兩個應用場景:后臺運行和跨進程訪問个少。Service可以在后臺執(zhí)行長時間運行操作而不提供用戶界面洪乍,除非系統(tǒng)必須回收內存資源,否則系統(tǒng)不會停止或銷毀服務夜焦。服務可由其他應用組件啟動壳澳,而且即使用戶切換到其他應用,服務仍將在后臺繼續(xù)運行茫经。 此外巷波,組件可以綁定到服務萎津,以與之進行交互,甚至是執(zhí)行進程間通信 (IPC);需要注意的是抹镊,Service是在主線程里執(zhí)行操作的锉屈,可能會因為執(zhí)行耗時操作而導致ANR.

其他組件調用startService()方法啟動一個Service。

其他組件調用bindService()方法綁定一個Service垮耳。


### Broadcast使用的一般步驟

1)實現(xiàn)一個廣播接收器

public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();? } }

2)注冊廣播

intentFilter = new IntentFilter();

intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");

myBroadcastReceiver = new MyBroadcastReceiver();

registerReceiver(myBroadcastReceiver, intentFilter);

3)發(fā)送廣播

Intent intent = new Intent("android.net.conn.CONNECTIVITY_CHANGE");

sendBroadcast(intent); // 發(fā)送廣播


### Butter Knife的使用

& Butter Knife常用于View控件的綁定.

class ExampleActivity extends Activity {

? @BindView(R.id.user) EditText username;

? @BindView(R.id.pass) EditText password;

? @BindString(R.string.login_error) String loginErrorMessage;

? @OnClick(R.id.submit) void submit() {

? ? // TODO call server...? }

? @Override public void onCreate(Bundle savedInstanceState) {

? ? super.onCreate(savedInstanceState);

? ? setContentView(R.layout.simple_activity);

? ? ButterKnife.bind(this);

? ? // TODO Use fields...? }

}

### RecyclerView的使用

如果你想使用RecyclerView颈渊,需要做以下操作:

RecyclerView.Adapter- 處理數(shù)據(jù)集合并負責綁定視圖

ViewHolder- 持有所有的用于綁定數(shù)據(jù)或者需要操作的View

LayoutManager- 負責擺放視圖等相關操作

ItemDecoration- 負責繪制Item附近的分割線

ItemAnimator- 為Item的一般操作添加動畫效果,如终佛,增刪條目等

可以看到對RecylerView的設置過程俊嗽,比ListView要復雜一些,這也是RecylerView高度解耦的表現(xiàn)铃彰,雖然代碼抒寫上有點復雜绍豁,但它的擴展性是極高的。在了解了RecyclerView的一些控制之后牙捉,緊接著來看看它的Adapter的寫法竹揍,RecyclerView的Adapter與ListView的Adapter還是有點區(qū)別的,RecyclerView.Adapter邪铲,需要實現(xiàn)3個方法:

①onCreateViewHolder()

? ? 這個方法主要生成為每個Item inflater出一個View鬼佣,但是該方法返回的是一個ViewHolder。該方法把View直接封裝在ViewHolder中霜浴,然后我們面向的是ViewHolder這個實例晶衷,當然這個ViewHolder需要我們自己去編寫。直接省去了當初的convertView.setTag(holder)和convertView.getTag()這些繁瑣的步驟阴孟。

②onBindViewHolder()

? ? ?這個方法主要用于適配渲染數(shù)據(jù)到View中晌纫。方法提供給你了一個viewHolder,而不是原來的convertView永丝。

③getItemCount()

? ? ? 這個方法就類似于BaseAdapter的getCount方法了锹漱,即總共有多少個條目。


### adb指令集

$ adb devices? # 列舉當前連接的調試設備

$ adb logcat -c? # 清除手機的log buffer

$ adb install ~/Downloads/nzcp5.apk? # 安裝apk

$ adb push ~/Desktop/temp.trace /sdcard/data/ # 拷貝本地文件到調試設備

$ adb kill-server? # 常與adb start-server聯(lián)用

$ adb shell? # 進入調試設備的Shell環(huán)境

$ adb tcpip 5555 # 開啟遠程調試模式

$ adb connect? # 通過wifi進行調試

$ adb shell am start # 根據(jù)Intent指向啟動Activity


### Android常用命令行

$ ps -ef | grep java # 查找指定進程

$ kill -9 進程號 # 徹底殺死某個進程

$ tail -100f catalina.out # 查看倒數(shù)100行數(shù)據(jù),tail是查閱正在改變的日志文件

$ ssh root@192.168.61.10 # 遠程登錄

$ java -jar test.jar? # 執(zhí)行jar包

$ curl -I http://www.baidu.com # http請求命令行工具,curl -X GET url,GET請求

$ scp -r root@IP:/home/nzcp.apk? /root/Desktop # scp從遠端拷貝文件到本地

========================== 附錄 ================================

& 抓緊時間積累經(jīng)驗,將任務劃分為一個一個的小目標來完成.經(jīng)驗最重要!!!

*** 常用的第三方框架 ***

implementation 'com.android.support:recyclerview-v7:26.1.0'

implementation 'com.jakewharton:butterknife:8.8.1'

annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

implementation 'com.squareup.okhttp3:okhttp:3.9.1'

implementation 'com.alibaba:fastjson:1.1.68.android'

implementation 'org.greenrobot:greendao:3.2.2'

implementation 'org.greenrobot:eventbus:3.1.1'

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末慕嚷,一起剝皮案震驚了整個濱河市哥牍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喝检,老刑警劉巖嗅辣,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異挠说,居然都是意外死亡澡谭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門损俭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛙奖,“玉大人潘酗,你說我怎么就攤上這事⊙阒伲” “怎么了仔夺?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長攒砖。 經(jīng)常有香客問我缸兔,道長,這世上最難降的妖魔是什么祭衩? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任灶体,我火速辦了婚禮阅签,結果婚禮上掐暮,老公的妹妹穿的比我還像新娘。我一直安慰自己政钟,他們只是感情好路克,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著养交,像睡著了一般精算。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碎连,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天灰羽,我揣著相機與錄音,去河邊找鬼鱼辙。 笑死廉嚼,一個胖子當著我的面吹牛,可吹牛的內容都是我干的倒戏。 我是一名探鬼主播怠噪,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼杜跷!你這毒婦竟也來了傍念?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤葛闷,失蹤者是張志新(化名)和其女友劉穎憋槐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淑趾,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡秦陋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了治笨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驳概。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡赤嚼,死狀恐怖,靈堂內的尸體忽然破棺而出顺又,到底是詐尸還是另有隱情更卒,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布稚照,位于F島的核電站蹂空,受9級特大地震影響,放射性物質發(fā)生泄漏果录。R本人自食惡果不足惜上枕,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弱恒。 院中可真熱鬧辨萍,春花似錦、人聲如沸返弹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽义起。三九已至拉背,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間默终,已是汗流浹背椅棺。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留齐蔽,地道東北人两疚。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像肴熏,于是被迫代替她去往敵國和親鬼雀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,519評論 25 707
  • afinalAfinal是一個android的ioc蛙吏,orm框架 https://github.com/yangf...
    passiontim閱讀 15,401評論 2 45
  • 不要在RecyclerView的控件內容更新中做耗時操作源哩,每個控件理想的就是僅僅進行set操作 在JavaWebs...
    傾倒的吞天壺閱讀 403評論 0 0
  • 高買低賣,追求最大的利益:最低點買入鸦做,最高點賣出励烦。簡單的道理,大家都懂泼诱,但是在中間卻需要我們掌握許多知識坛掠,從而來幫...
    小關_dec3閱讀 172評論 0 0
  • 老師: 你的畫很特別屉栓!斑馬也在上課舷蒲。 學生: 是啊,斑馬老師在教小斑馬認字友多,還告訴小斑馬:“獅子會吃斑馬牲平,你們看到...
    曹老師畫室閱讀 538評論 2 5