android開發中相見恨晚的冷知識

## 本篇都講些什么?

  • 如何排除第三方傳遞依賴導致的aar沖突

  • 如何保持依賴最新的aar

  • fragment里getActivity()空指針

  • 代碼new 出來的VIew沒有ID

  • 不傳遞的方式巧取context

  • 不使用handle回到主線程(即UI線程)

  • 防止VIew上信息被其他軟件截屏或系統截圖泄漏信息

  • 專制接二手渣渣項目快速看方法調用棧順序


如何排除第三方傳遞依賴導致的aar沖突

開發過程中經常出現你需要依賴第三方的某個庫,比如下面的代碼所示:

dependencies {
          compile 'com.github.BolexLiu:PressScanCode:v1.0.0'
}

PressScanCode是一個長按掃描屏幕上的二維碼工具庫,他底層的二維碼識別使用了zxing庫。我們假設作者開發時使用了老版本zxing 1.0.1的版本。而我們集成進來以后卻發現本身項目里也依賴Zxing 但是我們的版本是3.3.0的。由于包管理具有傳遞性。這時就會起沖突。gradle無法自己處理你到底是該依賴哪個。下面是處理辦法。

dependencies {
    compile('com.github.BolexLiu:PressScanCode:v1.0.0'', {
       exclude group: 'com.google.zxing' //排除依賴
    })
  compile 'com.google.zxing:core:3.3.0'
}

這樣做的意思排除PressScanCode原有的依賴。而選擇依賴我們自己設定的3.3.0的zxing庫。

如何保持依賴最新的aar

這個相當容易,代碼如下。你只需要將appcompat-v7:25.1.1這個版本好替換成“+”號即可每次都依賴最新的版本。

dependencies {
  // compile 'com.android.support:appcompat-v7:25.1.1'
    compile 'com.android.support:+'
}

fragment里getActivity()空指針

重寫fragment然后在onAttach方法存下一個Activity引用。在其他地方需用用到context或者Activity的時候使用該引用。而不使用getActivity()??梢怨姹苷飧鑫侍?。但請留意強引用可能會導致內存泄漏的問題。

protected Activity mActivity;
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    this.mActivity = activity;
}

代碼new 出來的VIew沒有ID

通常我們的VIew是通過布局文件依照@+id的方式在R文件中生成對映的一個Int值。這是用于運行時保證資源唯一性。但有一種情況,我們需要動態的在代碼中new出一個VIew來。如果一個VIew還好。多個view的時,沒有id會導致你不方便持有一個引用。那么可以 View的generateViewId() 方法來生成 id,讓系統來保證唯一。而不是用隨機數產生或者手寫一個具體的值。注:API17++


不傳遞的方式巧取context

context是我們經常用到的一個對象,這里我們不深入的講解context,它的本質只是android組件的一個抽象接口,封裝了一些統一的標準方法。有興趣可以自己去查資料或翻閱源碼。下面這張圖已經說明了。

下面提供一種思路通過VIew直接獲取context的api。特別是適配器中。別再傳遞這個對象了。注:從View上拿到的一定是Activity對象,但是如果你通過Service中或者Application中獲取的Context是不能用做操作View的。本質區別就是抽象方法和對象是無法保證你要操作的具體對象是你要的對象(這句話沒讀懂的多讀幾遍,慢點讀。說到底它就是依賴倒置原則問題)

View.getContext()  //任何被創建的VIEW都持有了context對象

不使用handle回到主線程(即UI線程)

通常我們使用Activity.runOnUiThread在子線程完成邏輯后更新UI。否則系統不會同意你在子線程中更新UI的?;褂幸恢殖【翱梢雜孟旅嫻腶pi

View.post(new Runnable() ) //同樣可以切回UI線程執行。

當然現在Rxjava和EventBus可以完美的解決此類問題。我更推薦Rxjava。


防止VIew上信息被其他軟件截屏或系統截圖泄漏信息

在某些特殊的場景下,你的app可能和用戶隱私有關系。如果需求需要禁止截圖行為和覆蓋你當前的Acitivity行為,可以使用 如下API。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE)

專制接二手渣渣項目快速看方法調用棧順序

我們可能因為跳槽,或者其他原因接觸到了一個陌生的項目??贍芩褪悄侵稚癲拍蕓炊拇?。有沒有辦法看某個方法到底是誰發起調用。都經過了什么過程呢?方法還是有的。如圖: one>tow>printStack。我們需要找出printStack的調用順序。

//在最后你想看的方法中加入以下代碼,就可以神奇的在日志中打印出來方法調用順序
   RuntimeException here = new RuntimeException("bolex");
        here.fillInStackTrace();
        Log.w("myTag", "Called: " + this, here);


嗯。今天就到這里


來源:安卓開發

上一篇: android 開發者如何選擇測試機列表

下一篇: 微信自用的移動端IM網絡層跨平臺組件庫Mars已正式開源

分享到: 更多
棋牌平台 北京pk10网赌投注平台 抢庄牛牛牛安卓版下载 极速时时彩计划软件下载 粤11选5技巧稳赚 快三有没有18期的长龙 七星彩局王 七乐彩开奖号码结果 11选5怎么杀号更准确 分分彩独胆 体彩排三六码组六最大遗漏乐彩网 3d组六稳赚不赔方案 今晚七乐彩开奖结果 押大小最好的倍投方法 赛车每天稳赚最新模式 时时彩稳赚技巧十年心得