10.第一行代碼的最佳實(shí)踐

一颗胡、活動(dòng)的最佳實(shí)踐

1. 知曉當(dāng)前是在哪一個(gè)活動(dòng)
背景:當(dāng)你進(jìn)入一家新公司们何,閱讀別人的代碼是很頭疼的事⊙乙牛現(xiàn)在偏偏需要你在某個(gè)界面修改一些非常簡(jiǎn)單的東西扇商,但是你花了很長(zhǎng)時(shí)間卻找不到這個(gè)界面對(duì)應(yīng)的是哪個(gè)活動(dòng)。

首先宿礁,我們新建一個(gè)BaseActivity繼承Activity案铺,然后重寫onCreate()方法,代碼如下:

public class BaseActivity extend Activity{
    
    @override
    protected void onCreate(Bundle saveInstanceState){
        super.onCreate(saveInstanceState);
        Log.d("BaseActivity",getClass.getSimpleName());  //logcat輸出當(dāng)前Activity的類名
    }
}

然后項(xiàng)目中的其他Activity都繼承BaseAcitivity梆靖,這樣每當(dāng)打開(kāi)當(dāng)前的活動(dòng)红且,他的名字都會(huì)log日志中顯示坝茎。

2. 隨時(shí)隨地退出程序
背景:比如我們從活動(dòng)A到B到C,此時(shí)我們想一步退出程序暇番,如果按home鍵只是在掛起在后臺(tái)嗤放,并沒(méi)有真正的退出。
思路其實(shí)很簡(jiǎn)單壁酬,我們只需要一個(gè)專門的集合類對(duì)所有的活動(dòng)進(jìn)行管理就可以了次酌。


public class AcitivityCollector{

    public static List<Activity> activities = new ArrayList<Activity>();
    
    //添加Activity
    public static void addActivity(Activity activity){
        activities.add(activity);
    }
    
    //移除Activity
    public static void removeAcitivity(Activity activity){
        activities.remove(activity);
    }
    
    //關(guān)閉所有的Activity
    public static void finishAll(){
        for(Activity activity:activities){
            if(!activity.isFinishing()){
                activity.finish();
            }
        }
    }

    //關(guān)閉所有Acitivit,只保留某個(gè)Acitivity
    public static void finishAllKeepOne(Class<?> clazz){
        for(Activity activity:activities){
            if (!clazz.getSimpleName().equals(activity.getClass().getSimpleName())){
                if(!activity.isFinishing()){
                    activity.finish();
                }
            }
        }
    }
}

然后我們?cè)贐aseAcitivity中稍作改動(dòng)舆乔,每個(gè)Activity創(chuàng)建時(shí)都加入都集合中岳服,銷毀后從集合移除:

public class BaseActivity extend Activity{
    
    @override
    protected void onCreate(Bundle saveInstanceState){
        super.onCreate(saveInstanceState);
        Log.d("BaseActivity",getClass.getSimpleName());  //logcat輸出當(dāng)前Activity的類名\
        
        ActivityCollector.addActivity(this);
    }
    
    @override
    protected void onDestroy(){
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
}

從此以后,不管你想在什么地方退出程序希俩,只需要調(diào)用AcitivityCollector.finish()方法就可以了吊宋。
例如想在ThirdActivity中直接退出程序:

public class ThirdActivity extend BaseActivity{
    
    @override
    protected void onCreate(Bundle saveInstanceState){
        super.onCreate(saveInstanceState);
        setContentView(R.layout.third_layout);
        Log.d("BaseActivity",getClass.getSimpleName());  //logcat輸出當(dāng)前Activity的類名\
        
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new onClickListener(){
                @override
                public void onClick(View v){
                    ActivityCollector.finishAll();
                }
            }
        );
    }
}

3. 啟動(dòng)活動(dòng)的最佳寫法
背景:在退隊(duì)寫作項(xiàng)目中,你負(fù)責(zé)FirstActivity颜武,而你的同事負(fù)責(zé)SecondActivity璃搜,這是你需要從FirstActivity跳轉(zhuǎn)到SecondActivity,而SecondActivity還需要兩個(gè)非常重要的字符串參數(shù)鳞上。這時(shí)無(wú)非有兩種辦法这吻,一是你去找你的同事問(wèn)需要哪兩個(gè)參數(shù);二是你自己閱讀SecondActivity中的代碼篙议。

其實(shí)我們可以這樣來(lái)做唾糯,避免上面的窘境,請(qǐng)看:

public class SecondActivity extend BaseActivity{
    
    //開(kāi)啟這個(gè)Activity的公共方法
    public static void actionStart(Context context,String data1,String data2){
        Intent intent = new Intent(context,SecondActivity.class);
        intent.putExtra("param1",data1);
        intent.putExtra("param2",data2);
        context.startActivity(intent);
    }
    ......
}

這樣寫的目的是代碼一目了然鬼贱,SecondActivity中所需的參數(shù)在方法中都體現(xiàn)出來(lái)了移怯,這樣你在FirstActivity中啟動(dòng)SecondActivity就非常簡(jiǎn)單了。

button.setOnClickListener(new onClickListener(){
                @override
                public void onClick(View v){
                    SecondActivity.actionStart(FirstActivity.this,"data1","data2");
                }
            }
        );

二这难、自定義控件簡(jiǎn)例

問(wèn)題背景:我們?cè)陧?xiàng)目中都會(huì)用到很多公用的控件舟误,比如每個(gè)頁(yè)面都有標(biāo)題,如下圖所示雁佳,粗略圖:

Paste_Image.png

我們可以將布局文件寫完脐帝,然后再include到每個(gè)Activity的xml中,這樣確實(shí)節(jié)省了一些代碼糖权,不用每個(gè)頁(yè)面都再寫一遍這個(gè)布局堵腹,但是返回和編輯兩個(gè)按鈕都是需要點(diǎn)擊處理的,邏輯代碼基本都一樣星澳。我們還是要每個(gè)頁(yè)面都處理這兩個(gè)按鈕的點(diǎn)擊事件疚顷,代碼的復(fù)用性又變的很差。

解決類似的問(wèn)題就用到我們自定控件,把按鈕的點(diǎn)擊事件都寫在自定義控件內(nèi)腿堤,如下:

public class TitleLayout extends LinearLayout{

    public TitleLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    public TitleLayout(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public TitleLayout(Context context) {
        this(context,null);
    }
    
    private void init(Context context){
        //引入布局界面
        LayoutInflater.from(context).inflate(R.layout.title, this);
        
         Button titleBack = (Button)findViewById(R.id.back);
         Button titleEdit = (Button)findViewById(R.id.edit);
         
         titleBack.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                ((Activity) getContext()).finish();
            }
        });
    }

}

這樣只需要xml中將自定義控件嵌入阀坏,點(diǎn)擊按鈕的代碼就都不需要寫了。

三笆檀、探究碎片F(xiàn)ragment

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末忌堂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子酗洒,更是在濱河造成了極大的恐慌士修,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,332評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件樱衷,死亡現(xiàn)場(chǎng)離奇詭異棋嘲,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)矩桂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門沸移,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人侄榴,你說(shuō)我怎么就攤上這事雹锣。” “怎么了牲蜀?”我有些...
    開(kāi)封第一講書人閱讀 157,812評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵笆制,是天一觀的道長(zhǎng)绅这。 經(jīng)常有香客問(wèn)我涣达,道長(zhǎng),這世上最難降的妖魔是什么证薇? 我笑而不...
    開(kāi)封第一講書人閱讀 56,607評(píng)論 1 284
  • 正文 為了忘掉前任度苔,我火速辦了婚禮,結(jié)果婚禮上浑度,老公的妹妹穿的比我還像新娘寇窑。我一直安慰自己,他們只是感情好箩张,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布甩骏。 她就那樣靜靜地躺著,像睡著了一般先慷。 火紅的嫁衣襯著肌膚如雪饮笛。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,919評(píng)論 1 290
  • 那天论熙,我揣著相機(jī)與錄音福青,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛无午,可吹牛的內(nèi)容都是我干的媒役。 我是一名探鬼主播,決...
    沈念sama閱讀 39,071評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼宪迟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼酣衷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起次泽,我...
    開(kāi)封第一講書人閱讀 37,802評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鸥诽,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后箕憾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體牡借,經(jīng)...
    沈念sama閱讀 44,256評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評(píng)論 2 327
  • 正文 我和宋清朗相戀三年袭异,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钠龙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,712評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡御铃,死狀恐怖碴里,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情上真,我是刑警寧澤咬腋,帶...
    沈念sama閱讀 34,389評(píng)論 4 332
  • 正文 年R本政府宣布,位于F島的核電站睡互,受9級(jí)特大地震影響根竿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜就珠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評(píng)論 3 316
  • 文/蒙蒙 一寇壳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妻怎,春花似錦壳炎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至榛丢,卻和暖如春铲球,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涕滋。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,026評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工睬辐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,473評(píng)論 2 360
  • 正文 我出身青樓溯饵,卻偏偏與公主長(zhǎng)得像侵俗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丰刊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評(píng)論 2 350

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