[編碼好心情]新開專題,專題講的是:好的編碼習(xí)慣也能讓你碼出好心情~~
<p />
Update List
- [12/13] 補(bǔ)充上項(xiàng)目的GitHub地址: https://github.com/Yeewoe/jianshu_intent_demo

關(guān)于Intent(意圖),即啟動Activity、Service等組件的方式。包含需要啟動的對象、攜帶的數(shù)據(jù)(Bundle)、啟動的方式(FLAG)、是否需要等待監(jiān)聽結(jié)果(Result)等功能。
關(guān)于上述Intent所講的每個(gè)部分抽開講其實(shí)都可以是單獨(dú)的技術(shù)文,網(wǎng)上也找到了一些好前輩們寫的資料,這里放上一部分供大家參考(自己有用印象筆記做記錄習(xí)慣,比如FLAG的東西是總怕忘記,需要經(jīng)常查閱~~ 如日?;煜?strong>FLAG_ACTIVITY_CLEAR_TOP和**FLAG_ACTIVITY_SINGLE_TOP ** <( ̄ˇ ̄)/),下面貼上連接
官方的Intent指南,Intent 和 Intent 過濾器 (這里關(guān)于顯示和隱式啟動區(qū)別、待定Intent即PendingIntent 以及Intent的解析等都講得十分詳細(xì))
CSDN的nei504293736,android Intent.FLAG大全 (關(guān)于常用FLAG這里列舉的比較全了)
CSDN的liuhe688,基礎(chǔ)總結(jié)篇之二:Activity的四種launchMode (圖文介紹launchMode,寫的也很好)
本文的重點(diǎn)是分享日常在編碼時(shí)如何去管理你的Intent,從Intent開始,培養(yǎng)優(yōu)雅的編碼習(xí)慣!?。?*下面我們一步一步去拆解和構(gòu)造一個(gè)屬于自己的Intent生態(tài)。
先來一段目標(biāo)代碼
package org.yeewoe.intentdemo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class SignInActivityextends AppCompatActivity {
// ...
public void onSignIn() {
// TODO verify account 、password ...
/** 如果一切校驗(yàn)通過,這里將跳往到主界面 **/
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra(MainActivity.EXTRA_FROM, this.getClass().getName());
intent.putExtra(MainActivity.EXTRA_ACCOUNT, "輸入的用戶名");
startActivity(intent);
/** 這里需要銷毀LoginActivity,避免從{@linkplain org.yeewoe.intentdemo.MainActivity 主界面}點(diǎn)擊返回到這里||| **/
finish();
}
// ...
}
上面的代碼是不是似曾相識|||,代碼很簡單,要做的就是往某個(gè)界面跳轉(zhuǎn),以及及時(shí)銷毀本身。說說這樣寫的問題有哪些:
- 調(diào)用方需要知道主界面是哪個(gè),假如你們是一個(gè)Team一起工作,那你可能就得弄清楚目標(biāo)Activity了
- 調(diào)用方需要知道自己需要傳的extra參數(shù)的name,通常name是由解析方提供的,那你可能就得去弄清楚目標(biāo)Activity更多的細(xì)節(jié)了。
- 仔細(xì)觀察這里要傳的參數(shù)是調(diào)用方類本身的名字,屬于通用型參數(shù)。假設(shè)你的Intent生態(tài)里面每個(gè)調(diào)用方都需要傳入這種類似而且必須要帶上的參數(shù)。那簡直是一場噩夢,假設(shè)要修改參數(shù)就得每個(gè)地方做檢查和改動
- finish自身的方式雖然可以,但是并不推薦,會導(dǎo)致全局的過渡動畫失效,有興趣的童鞋可以試試。而且重點(diǎn)是這種方式并不優(yōu)雅~~
- ...
根據(jù)我提的一堆問題,稍微有經(jīng)驗(yàn)的都知道需要抽離代碼到一個(gè)單獨(dú)的類上做管理,體現(xiàn)分層思想:
構(gòu)建一個(gè)專門的局部性Intent管理類
我的習(xí)慣是構(gòu)建局部性的管理類,若直接提供一個(gè)總的管理類,隨著項(xiàng)目的增大可能會顯得臃腫難以管理。如何定義局部:假設(shè)項(xiàng)目是按功能分模塊的,那每個(gè)功能模塊我們給一個(gè)單獨(dú)的Intent管理類。這里我們新建一個(gè)AuthIntentManager類
package org.yeewoe.intentdemo;
import android.app.Activity;
import android.content.Context;
/**
* <h3>ClassInfo</h3>
* auth模塊使用的Intent管理類
* <p />
* <h3>可處理的功能</h3>
* <ul>
* <li>注冊跳轉(zhuǎn)</li>
* <li>主界面跳轉(zhuǎn)</li>
* </ul>
*
* Created by yeewoe on 2016/12/12.
*/
public class AuthIntentManager {
/**
* 跳往注冊頁面
*/
public static void intentToSignUp(Activity activity) {
}
/**
* 跳轉(zhuǎn)主界面
*/
public static void intentToMain(Context context, String account) {
}
}
類注釋查看后是

這里用到一些HTML語法的注釋,關(guān)于這些查看我之前的一篇文章 編寫優(yōu)美Android注釋的常用語法 <( ̄ˇ ̄)/ , 在這里謝謝童鞋們對我的支持了!
這個(gè)類現(xiàn)在還不能干什么事,但是我們已經(jīng)將代碼的結(jié)構(gòu)做了初步的處理。 我們知道調(diào)用方需要帶各種參數(shù)。為了讓調(diào)用方不用過多的去了解傳參的細(xì)節(jié)。那我們需要做進(jìn)一步處理:
將參數(shù)細(xì)節(jié)封裝進(jìn)Intent管理類
將跳轉(zhuǎn)主界面的方法做具體實(shí)現(xiàn):
/**
* 跳轉(zhuǎn)主界面
*/
public static void intentToMain(Context context, String account) {
Intent intent = new Intent(context, MainActivity.class);
intent.putExtra(MainActivity.EXTRA_FROM, context.getClass().getName());
intent.putExtra(MainActivity.EXTRA_ACCOUNT, account);
context.startActivity(intent);
}
好的,我們將Extra參數(shù)信息封裝進(jìn)來了,這樣外界調(diào)用已經(jīng)不需要知道這些信息了~~ 接著,我們上面提到這里的EXTRA_FROM屬于類似且必須的參數(shù),基本我們每個(gè)Intent調(diào)用都會傳,怎么辦呢,這里繼承能幫到我們:
提供Intent管理類基類,提供公共處理方法
直接上基類AbsIntentManager代碼:
public abstract class AbsIntentManager {
private static final String EXTRA_FROM = "extra_from";
public static Intent buildIntent(Context context, Class<?> clazz) {
Intent intent = new Intent(context, clazz);
intent.putExtra(EXTRA_FROM, context.getClass().getName());
return intent;
}
public static Intent buildIntent(Context context, Class<?> clazz, int flags) {
Intent intent = new Intent(context, clazz);
intent.putExtra(EXTRA_FROM, context.getClass().getName());
if (flags > 0) {
intent.addFlags(flags);
}
return intent;
}
}
子類繼承后做適配:
public class AuthIntentManager extends AbsIntentManager {
/**
* 跳往注冊頁面
*/
public static void intentToSignUp(Activity activity) {
}
/**
* 跳轉(zhuǎn)主界面
*/
public static void intentToMain(Context context, String account) {
Intent intent = buildIntent(context, MainActivity.class);
intent.putExtra(MainActivity.EXTRA_ACCOUNT, account);
context.startActivity(intent);
}
}
好了,這樣我們的Intent調(diào)用就解決了參數(shù)暴露以及公共部分難維護(hù)的問題了。 Intent生態(tài)也初步見雛形。接下來需要討論個(gè)問題,我們的問題提到SignInActivity用的finish自我銷毀方式并不妥當(dāng),那需要怎么去替換這種方式,另外關(guān)于啟動銷毀模式的管理怎么去融合到我們的Intent管理的生態(tài)圈里面。
整理你的App的Intent模式
如上面我們需要用到跳轉(zhuǎn)后自我銷毀的模式,另外我也列舉一下常見的(這里我們先不跟Intent的launchMode以及FLAGS做掛鉤,只討論和交互有關(guān)的模式):
- 跳轉(zhuǎn)到指定界面,并且該界面只初始化一次
- 界面點(diǎn)擊返回后跳轉(zhuǎn)固定跳轉(zhuǎn)到指定界面
- 當(dāng)前界面可能會被多次啟動,我們只需要顯示一個(gè),重復(fù)的都要去掉
- ...
前期列舉完后(怎么可能列舉得完。。你知道產(chǎn)品會怎么變嗎-_-|||),接下來,我們需要一個(gè)強(qiáng)大的,能屏蔽具體實(shí)現(xiàn)細(xì)節(jié),只暴露使用模式給我們Intent生態(tài)使用的方法!
小結(jié)
這篇文章先寫到這啦,看完對編碼習(xí)慣有沒有一定的體會~! 總的來說,講得是:提取管理類,抽離Extra參數(shù)細(xì)節(jié),提供一個(gè)基類,將公共行為邏輯分裝到基類和整理App的Intent模式。一步步將Intent相關(guān)的邏輯打造成一個(gè)生態(tài)做統(tǒng)一管理。稍作整理我再把后續(xù)部分寫出來給大家分享~~~ ^ ^
·
·
·
·
·
·
·
·
·