Android開發(fā)Tips(5)

歡迎Follow我的GitHub, 關(guān)注我的簡書. 其余參考Android目錄.

Android

本文的合集已經(jīng)編著成書限府,高級Android開發(fā)強化實戰(zhàn)碎紊,歡迎各位讀友的建議和指導(dǎo)。在京東即可購買:https://item.jd.com/12385680.html

Android

介紹關(guān)于Android的一些有趣的小知識點. 本文是第五篇了, 幾乎一周一篇, 歡迎閱讀.
其余第一篇, 第二篇, 第三篇, 第四篇.


1. 模擬系統(tǒng)回收Activity.

使用adb命令可以模擬Android系統(tǒng)自動回收Activity進程, 可以調(diào)試這個效果.
單進程

adb shell am force-stop [包名]

多進程

adb shell ps | grep [包名]
adb shell kill [PID]

2. Android庫動態(tài)權(quán)限建議

Android 6.0使用動態(tài)權(quán)限, 在創(chuàng)建第三方庫時, 需要充分考慮這一特性.
(1) 在自動Merge庫的AndroidManifest時, 需要提供危險權(quán)限的提示文檔.
(2) 當權(quán)限未獲取時, 用戶可以使用庫的某一部分, 并提示缺少權(quán)限.
(3) 需要提供在權(quán)限獲取失敗時, 庫使用方式的文檔.
(4) 確保所有權(quán)限都是必須的, 不含有未使用權(quán)限.

關(guān)于提示用戶獲取權(quán)限的解決方案, 可以參考.


3. RxJava處理Retry請求服務(wù)器

服務(wù)器經(jīng)常會出現(xiàn)異常, 應(yīng)用需要連續(xù)嘗試請求, RxJava可以非常簡單的實現(xiàn).

模板

Observable<Boolean> source = ...; // Something that eventually emits true

source
    .repeatWhen(completed -> completed.delay(1, TimeUnit.SECONDS))
    .takeUntil(result -> result)
    .filter(result -> result)
    .subscribe(
        res -> System.out.println("onNext(" + res + ")"),
        err -> System.out.println("onError()"),
        () -> System.out.println("onCompleted()")
    );

示例

/**
 * This is a class that should be
 * mapped on your json response from the server
 */
class ServerPollingResponse {
    boolean isJobDone;

    @Override
    public String toString() {
        return "isJobDone=" + isJobDone;
    }
}

Subscription checkJobSubscription = mDataManager.pollServer(inputData)
        .repeatWhen(new Func1<Observable<? extends Void>, Observable<?>>() {
            @Override
            public Observable<?> call(Observable<? extends Void> observable) {
                Log.v(TAG, "repeatWhen, call");
                /**
                 * This is called only once.
                 * 5 means each repeated call will be delayed by 5 seconds
                 */
                return observable.delay(5, TimeUnit.SECONDS);
            }
        })
        .takeUntil(new Func1<ServerPollingResponse, Boolean>() {
            @Override
            public Boolean call(ServerPollingResponse response) {
                /** Here we can check if the responce is correct and if we should
                 *  finish polling
                 *  We finish polling when job is done.
                 *  In other words : "We stop taking when job is done"
                 */
                Log.v(TAG, "takeUntil, call response " + response);
                return response.isJobDone;
            }
        })
        .filter(new Func1<ServerPollingResponse, Boolean>() {
            @Override
            public Boolean call(ServerPollingResponse response) {
                /**
                 * We are filtering results if we return "false".
                 * Filtering means that onNext() will not be called.
                 * But onComplete() will be delivered.
                 */
                Log.v(TAG, "filter, call response " + response);
                return response.isJobDone;
            }
        })
        .subscribe(
                new Subscriber<ServerPollingResponse>() {
                    @Override
                    public void onCompleted() {
                        Log.v(TAG, "onCompleted ");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.v(TAG, "onError ");
                    }

                    @Override
                    public void onNext(ServerPollingResponse response) {
                        Log.v(TAG, "onNext response " + response);
                        // Do whatever you need. Server polling has been finished
                    }
                }
        );

參考參考.


4. Chrome的JsonView插件

添加插件之后, 可以格式化的顯示Json數(shù)據(jù).

JsonView

5. 顯示Activity棧的Shell命令

Shell命令

adb shell dumpsys activity | sed -n -e '/Stack #/p' -e '/Running activities/,/Run #0/p'

直接獲取Activity信息有些冗余, 我們只關(guān)注堆棧信息即可.
sed可以編輯顯示的文字.
-n, 從截取處開始連續(xù)處理.
-e, 多選參數(shù).
'/Stack #/p', 輸出含有Stack #的行.
-e '/Running activities/,/Run #0/p', 輸出從Running activitiesRun #0的所有行.

輸出結(jié)果

  Stack #1:
    Running activities (most recent first):
      TaskRecord{299f41ea #2269 A=me.chunyu.spike.wcl_activity_launchmode_demo U=0 sz=6}
        Run #5: ActivityRecord{33926043 u0 me.chunyu.spike.wcl_activity_launchmode_demo/.MainActivity t2269}
        Run #4: ActivityRecord{3f181566 u0 me.chunyu.spike.wcl_activity_launchmode_demo/.MainActivity t2269}
        Run #3: ActivityRecord{22737e45 u0 me.chunyu.spike.wcl_activity_launchmode_demo/.MainActivity t2269}
        Run #2: ActivityRecord{ce0a990 u0 me.chunyu.spike.wcl_activity_launchmode_demo/.MainActivity t2269}
        Run #1: ActivityRecord{3de8e378 u0 me.chunyu.spike.wcl_activity_launchmode_demo/.MainActivity t2269}
        Run #0: ActivityRecord{1cb28ec4 u0 me.chunyu.spike.wcl_activity_launchmode_demo/.MainActivity t2269}
  Stack #0:
    Running activities (most recent first):
      TaskRecord{bfee9cf #2241 A=com.miui.home U=0 sz=1}
        Run #0: ActivityRecord{279bc098 u0 com.miui.home/.launcher.Launcher t2241}

6. dp和sp的區(qū)別

dp是Android頁面常用的度量單位, sp主要用于字體度量.
在標準情況下, dp等于sp. 然而, Android系統(tǒng)允許用戶設(shè)置字體大小, sp會隨著字體的大小而改變, 放大或是縮小.
設(shè)置位置(紅米): Android -> 設(shè)置 -> 字體大小 -> 標準(默認)或大小號.


7. AlertDialog獲取全部屏幕監(jiān)聽

在Android 4.0以上, AlertDialog在觸摸對話框邊緣外部時, 對話框消失.
在AlertDialog.Builder.create(), 可以設(shè)置屬性獲取屏幕監(jiān)聽.
方法一:

setCanceledOnTouchOutside(false);

調(diào)用這個方法時, 按對話框以外的地方不起作用. 按返回鍵仍起作用.

方法二:

setCancelable(false);

調(diào)用這個方法時, 按對話框以外的地方不起作用. 按返回鍵也不起作用.


8. getColor遺棄

最新版本的getColor被遺棄(deprecated), 使用時, 需要添加主題.
也可以使用兼容模式, 即

ContextCompat.getColor(context, R.color.your_color);

ContextCompat.getColor的源碼

public static final int getColor(Context context, int id) {
    final int version = Build.VERSION.SDK_INT;
    if (version >= 23) {
        return ContextCompatApi23.getColor(context, id);
    } else {
        return context.getResources().getColor(id);
    }
}

9. libarchive和expat簡介

libarchive
Multi-format archive and compression library. 多格式存檔和壓縮庫.
Android的toolchain使用libArchive.
參考

expat
Expat is an XML parser library written in C. Expat是用C語言寫的XML解析庫.
Android的Platform的擴展.
參考

libarchive 2.8.4和expat 2.1.0會產(chǎn)生漏洞, 如需修復(fù), 需要升級Android的編譯版本.


10. 網(wǎng)頁重定向

默認鏈接會跳轉(zhuǎn)其他鏈接, 根據(jù)鏈接內(nèi)容, 進行相應(yīng)操作, 如下載Apk等. 如果使用重定向, 則返回false; 如果非重定向, 則返回true.

        WebViewClient webClient = new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (url.endsWith(".apk")) {
                    DownloadUtils.downloadFiles(url);
                    if (mStartDownloadAppListener != null) {
                        mStartDownloadAppListener.doAfter();
                    }
                    return true;
                }
                return false;
            }
        };
        setWebViewClient(webClient);

OK, that's all! Enjoy it!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市封恰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌灭抑,老刑警劉巖檩淋,帶你破解...
    沈念sama閱讀 212,185評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異派近,居然都是意外死亡攀唯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評論 3 385
  • 文/潘曉璐 我一進店門渴丸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侯嘀,“玉大人,你說我怎么就攤上這事谱轨〗溽#” “怎么了?”我有些...
    開封第一講書人閱讀 157,684評論 0 348
  • 文/不壞的土叔 我叫張陵碟嘴,是天一觀的道長溪食。 經(jīng)常有香客問我,道長娜扇,這世上最難降的妖魔是什么错沃? 我笑而不...
    開封第一講書人閱讀 56,564評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮雀瓢,結(jié)果婚禮上枢析,老公的妹妹穿的比我還像新娘。我一直安慰自己刃麸,他們只是感情好醒叁,可當我...
    茶點故事閱讀 65,681評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般把沼。 火紅的嫁衣襯著肌膚如雪啊易。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,874評論 1 290
  • 那天饮睬,我揣著相機與錄音租谈,去河邊找鬼。 笑死捆愁,一個胖子當著我的面吹牛割去,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昼丑,決...
    沈念sama閱讀 39,025評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼呻逆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了菩帝?” 一聲冷哼從身側(cè)響起咖城,我...
    開封第一講書人閱讀 37,761評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胁附,沒想到半個月后酒繁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,217評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡控妻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,545評論 2 327
  • 正文 我和宋清朗相戀三年州袒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弓候。...
    茶點故事閱讀 38,694評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡郎哭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出菇存,到底是詐尸還是另有隱情夸研,我是刑警寧澤,帶...
    沈念sama閱讀 34,351評論 4 332
  • 正文 年R本政府宣布依鸥,位于F島的核電站亥至,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贱迟。R本人自食惡果不足惜姐扮,卻給世界環(huán)境...
    茶點故事閱讀 39,988評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衣吠。 院中可真熱鬧茶敏,春花似錦、人聲如沸缚俏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恬惯,卻和暖如春向拆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酪耳。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評論 1 266
  • 我被黑心中介騙來泰國打工亲铡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人葡兑。 一個月前我還...
    沈念sama閱讀 46,427評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像赞草,于是被迫代替她去往敵國和親讹堤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,580評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,810評論 25 707
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程厨疙,因...
    小菜c閱讀 6,373評論 0 17
  • 面試題總結(jié) 通用 安卓學(xué)習(xí)途徑, 尋找資料學(xué)習(xí)的博客網(wǎng)站 AndroidStudio使用, 插件使用 安卓和蘋果的...
    JingBeibei閱讀 1,658評論 2 21
  • 你準備很久的考試洲守,人家突擊兩天得到比你好的成績。 你天天做習(xí)題沾凄,以防錯過考試題目梗醇,人家和老師關(guān)系好問到了原...
    Sh靖閱讀 220評論 1 1
  • 頸椎病發(fā)病增加,成為人們學(xué)習(xí)和工作的一大危害姑尺,許多人因此而耽誤了學(xué)習(xí)竟终、影響了工作,實際上切蟋,只要做好適當?shù)念A(yù)防和康復(fù)...
    速途的健康閱讀 1,567評論 0 1