4種默認的launchmode,以及OnNewIntent的回調。javascript
OnNewIntent->OnRestart->OnStart->onResumehtml
OnActivity->OnResume.java
OnNewIntent ,OnActivityResult?android
OnNewIntent launchmode with singletask or singleInstance.程序員
but if set these two mode. OnActivityResult will be called after startActivityforResult directly。web
so normally,they can not called both.面試
OnSaveInstanceState:數據庫
在Activity這個方法的地方有一段描述:當activity將要被kill的時候,系統會開放這個藉口供程序員調用編程
而後它會把bundle信息傳遞到OnCreate & Bundle裏面。json
這個方法必定會在OnStop以前被調用,but 與OnPause的順序沒法肯定。
某些狀況下,生命週期不會走到OnDestroy,可是有些資源須要釋放。這時候,最好是事件驅動。
Fragment 的生命週期:Android四大組件之Activity & Fragement
Fragment和activity溝通,
fragmentmaneger.findFragmentById
fragmentmaneger.findFragmentByTag,
fragment之間的溝通,setArgument。
getActivity & addlistener等。
數據存儲和恢復。onSaveInstanceState:Fragment的該func同Activity同步。
FragmentTransaction transaction = fm.benginTransatcion();//開啓一個事務
transaction.add()
往Activity中添加一個Fragment
transaction.remove()
從Activity中移除一個Fragment,若是被移除的Fragment沒有添加到回退棧(回退棧後面會詳細說),這個Fragment實例將會被銷燬。
transaction.replace()
使用另外一個Fragment替換當前的,實際上就是remove()而後add()的合體~
transaction.hide()
隱藏當前的Fragment,僅僅是設爲不可見,並不會銷燬
transaction.show()
顯示以前隱藏的Fragment
detach()
會將view從UI中移除,和remove()不一樣,此時fragment的狀態依然由FragmentManager維護。
attach()
重建view視圖,附加到UI上並顯示。
transatcion.commit()//提交一個事務
注意:經常使用Fragment的哥們,可能會常常遇到這樣Activity狀態不一致:State loss這樣的錯誤。主要是由於:commit方法必定要在Activity.onSaveInstance()以前調用。
上述,基本是操做Fragment的全部的方式了,在一個事務開啓到提交能夠進行多個的添加、移除、替換等操做。
值得注意的是:若是你喜歡使用Fragment,必定要清楚這些方法,哪一個會銷燬視圖,哪一個會銷燬實例,哪一個僅僅只是隱藏,這樣才能更好的使用它們。
其餘問題:Android Fragment 真正的徹底解析(下)
FragmentTransaction.addToBackStack(String):若是是replace的方法,那麼當前fragment會被remove掉,全部back的時候,fragment的狀態不會保留,只會從新
建立。而若是是hide & add的方法,就會把以前的fragment從新attch上。
若是activity管理fragment,能夠調用fragment的全部public方法。
能夠經過findfragmentbyid & findfragmentbytag來定位fragment,而後同上。
fragment能夠經過getactivity得到實例。
當屏幕旋轉是,fragment會被重複建立,這是時候若是使用OnCreate的bundle參數,就能夠判斷是不是第一次建立。
activity的默認實現bundle參數是有內容的。
android 進程間通訊數據(一)------parcel的起源
爲何要序列化:爲了跨進程通訊,應爲進程間通訊就是二進制格式,因此序列化能夠經過反序列化,把數據還原。
parcable是內存機的序列化,因此速度快。
package com.joyfulmath.publibrary.json; import com.alibaba.fastjson.JSON; import com.joyfulmath.publicutils.utils.TraceLog; /** * @author deman.lu * @version on 2016-03-24 17:20 * 使用fastjson 來解析該問題 */ public class JsonUtils { public static <T> T parseObject(String jsonStr, Class<T> entityClass) { T ret = null; try { ret = JSON.parseObject(jsonStr,entityClass); }catch (Exception e) { TraceLog.e("parseObject-something Exception with:" + e.toString()); } return ret; } public static String toJSONString(Object obj) { String ret = null; try { ret = JSON.toJSONString(obj); } catch (Exception e) { e.printStackTrace(); } return ret; } }
消息機制:android 進程/線程管理(一)----消息機制的框架 請看這個系列。
ExecutorService:線程池,能夠提供關閉操做,等待關閉和直接關閉。
Picasso,square公司出品的圖片加載器,內部使用OKHttp執行網絡請求。
能夠支持URL,FILE,數據庫等路徑的加載。圖片不會縮放,
Picasso & Glide
首先Glide是基於Picasso的二次開發
with參數:Glide可使用Activity、fragment等。因此它的加載能夠和actiivty的生命週期綁定。
Glide默認圖片ARGB_565 piocasso:ARGB_8888
Glide loading Gif but Picasso cannot. but Glide will using much memory with gif.
Glide will cache with size of imageview, so each size of imageview will contains one copy.
Picasso will only has one cahce copy with fullsize. so glide is faster than picasso.
Glide 有助於減小OOM的發生。
/** * Created by deman on 2016/3/30. */ public interface IImageLoader { void initLoader(Context context); void load(String path, ImageView view, int width, int height); void load(String path, ImageView view); }
public class ImageLoadManger { private IImageLoader iImageLoader = null; private static ImageLoadManger sInstance = null; public static synchronized ImageLoadManger getsInstance() { if (sInstance == null) { sInstance = new ImageLoadManger(); } return sInstance; } /** * initManager * @param context context */ public void initManager(Context context) { iImageLoader = new PicassoImageLoader(); iImageLoader.initLoader(context); } /** * load image with path * @param path path * @param imageView imageView */ public void load(String path, ImageView imageView) { if(null == iImageLoader) { throw new RuntimeException("initManager has not been init"); } iImageLoader.load(path, imageView); } /** * load image with path * @param path path * @param imageView imageView * @param width width * @param height height */ public void load(String path, ImageView imageView,int width,int height) { if(null == iImageLoader) { throw new RuntimeException("initManager has not been init"); } iImageLoader.load(path, imageView,width,height); } }
public class PicassoImageLoader implements IImageLoader { Picasso picasso; Context context; private void init() { picasso = new Picasso.Builder(context).build(); } @Override public void initLoader(Context context) { this.context = context; init(); } @Override public void load(String path, ImageView view,int width,int height) { if(null == path) { throw new RuntimeException("uri is null!"); } if(width == 0 || height == 0) { throw new RuntimeException("width & height is 0"); } picasso.load(path) .resize(width, height) .into(view); } @Override public void load(String path, ImageView view) { if(null == path) { throw new RuntimeException("uri is null!"); } picasso.load(path) .into(view); } }
Glide 500K,Picasso 100K
Fresco,是facebook開源的一套圖片加載框架。它的使用是基於view級別的。SimpleDraweeView
Fresco, image pipline技術,三級緩存。因此不容易oom。
第一層。bitmap緩存:在5.0上,使用java heap,5.0一下,使用ashme內存,減小GC發生的機率。
app到後臺,bitmap緩存被清空。
第二層,內存緩存。存放原始的壓縮圖片。
第三層,磁盤緩存,不會被清空。
Fresco對內存的節省效果很大,尤爲是低端機,能夠減小OOM的概率。
包比較大,並且使用起來也複雜。
7.Adapter 和 ListView 組合。
登錄設計:
1)登錄跳轉
首先是登錄到指定頁面,好比MainActivity,
還有就是登錄後,回到上一頁。
這2中須要在登錄的時候考慮到。
2)登錄的密碼驗證
密碼加密後傳輸,以參數的形式。
API使用https請求。
登錄成功後,須要把userinfo存到本地,以便退出後,能夠自動登錄。
3)自動登錄
token機制。每次登錄成功後,本地保存一個token信息,同時token能夠保存過時的信息機制。
token過時後,全部先關API(須要驗證token信息的),都會返回相同的code信息,而後統一處理。
彈出AlertDialog,讓用戶去判斷是否須要登錄。
Volley
Volley+okhttp
Retrofit
其中Retrofit+okHttp+Picasso 是square公司統一出品的。
主流的套路是,把每一個框架都分開了,這樣便於替換。
Retrofit+okHttp /Volley+Okhttp add fastjson , Glide/Fresco + buttnkinfe/dragger2/androidannotation + Rebotim.
Android 框架學習之 第一天 okhttp & Retrofit
H5調用andoriod代碼:
webSettings.setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
js回調,@JavascriptInterface
android 調用JS
mWebView.loadUrl("javascript:wave()");
跳轉協議:
當JS回調的時候,能夠在shouldOverrideUrlLoading的時候
把URL配置成一個協議。
混淆的開啓:androidstudio:
在gradle裏面,有
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
關鍵是minifyEnabled 編程true,混淆編譯就會打開。
通常須要配置proguard-rules.pro
proguard4大過程:
壓縮,字節碼優化,混淆,預檢。
proguard 能夠配置版本:
proguard在sdk裏面。
proguard能夠配置過程:
-dontshrink 不壓縮輸入的類文件
-dontoptimize 不優化輸入的類文件
-dontobfuscate 不混淆輸入的類文件
包括sdk的命令。
打包過程:aapt用來生成資源文件R.java
java編譯器->class文件,而後dex編譯成.dex文件。
aapt放置的resource
打包成apk文件。
其餘的最終會生成dex文件。+sign 過程,就是APK,固然可能須要壓縮優化。
首先是,對於沒有處理的crash地方,經過UnCaughtExceptionHandler 來處理和收集日誌。
三步:
收集日誌併發送到服務器
提示用戶處理
保存到SD
須要把proguardmapping文件保存下來,以便線上app分析問題。
monkey就是對屏幕進行隨機事件發送,通常次數都在1W次以上,主要測試結果是crash,ANR的事件。
monkey對象是apk
monkey的事件流是隨機的。
monkey的文檔:http://developer.android.com/guide/developing/tools/monkey.html
androidstudio工具:
AndroidMonitor:StartMethodTracing 測試method執行時間。
DDMS也有traceView,功能是同樣的。
測試View的佈局:hierachyviewer.
debug:高級調試功能:
Evaluate Expression:在run菜單下面,有這個選項,它的功能同watch差很少,可是它能夠測試執行語句。
條件斷點:在循環裏面,你只對i=9感興趣,你怎麼辦,在斷點的位置,右擊,出現條件。
日誌斷點:也是一個很是實用的技能,當咱們某些狀況下須要打印日誌,可是每次編譯很是耗時,這個時候,咱們實用日誌斷點,能夠打印日誌,而
不修改源代碼。在Debug窗口裏面的console裏面能夠看到打印的日誌。
方法斷點:方法斷點就是在函數名的這同樣,斷點,它會在函數入口和結束的地方斷點。
異常斷點:就是Run->View blockpoint->javaException.
屬性斷點:就是在某個屬性被修改或者訪問的時候,可是多線程複雜環境下,很難發現。Run->View blockpoint->javaFieldWatchpoints.
DDMS:Android Studio中怎麼使用DDMS工具?
public class ExampleTest extends InstrumentationTestCase { public void test() throws Exception { final int expected = 1; final int reality = 1; assertEquals(expected, reality); } public void test_2() throws Exception{ final int expected = 2; final int reality = 3; assertEquals(expected,reality); } }
須要在configration裏面配置。
stage是index區, 一個概念,對應work區 和history區
revert:就是把某次歷史提交給取消掉,but它的提交記錄會被保留,也就是能夠提交到遠程庫。
reset:只是回退歷史,回退內容能夠被保留在work區域。
cherry pick:branch2 上的某條修改,須要merge到branch3上,but我只是須要這一條修改,用這條指令。
sub module:用處不是很大。
專開一篇講解
TBD.
TBD.
TBD.
TBD.