10.第一行代碼的最佳實踐

一、活動的最佳實踐

1. 知曉當前是在哪一個活動
背景:當你進入一家新公司,閱讀別人的代碼是很頭疼的事。現在偏偏需要你在某個界面修改一些非常簡單的東西,但是你花了很長時間卻找不到這個界面對應的是哪個活動。

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

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

然后項目中的其他Activity都繼承BaseAcitivity,這樣每當打開當前的活動,他的名字都會log日志中顯示。

2. 隨時隨地退出程序
背景:比如我們從活動A到B到C,此時我們想一步退出程序,如果按home鍵只是在掛起在后臺,并沒有真正的退出。
思路其實很簡單,我們只需要一個專門的集合類對所有的活動進行管理就可以了。


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);
    }
    
    //關閉所有的Activity
    public static void finishAll(){
        for(Activity activity:activities){
            if(!activity.isFinishing()){
                activity.finish();
            }
        }
    }

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

然后我們在BaseAcitivity中稍作改動,每個Activity創建時都加入都集合中,銷毀后從集合移除:

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

從此以后,不管你想在什么地方退出程序,只需要調用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輸出當前Activity的類名\
        
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new onClickListener(){
                @override
                public void onClick(View v){
                    ActivityCollector.finishAll();
                }
            }
        );
    }
}

3. 啟動活動的最佳寫法
背景:在退隊寫作項目中,你負責FirstActivity,而你的同事負責SecondActivity,這是你需要從FirstActivity跳轉到SecondActivity,而SecondActivity還需要兩個非常重要的字符串參數。這時無非有兩種辦法,一是你去找你的同事問需要哪兩個參數;二是你自己閱讀SecondActivity中的代碼。

其實我們可以這樣來做,避免上面的窘境,請看:

public class SecondActivity extend BaseActivity{
    
    //開啟這個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中所需的參數在方法中都體現出來了,這樣你在FirstActivity中啟動SecondActivity就非常簡單了。

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

二、自定義控件簡例

問題背景:我們在項目中都會用到很多公用的控件,比如每個頁面都有標題,如下圖所示,粗略圖:

Paste_Image.png

我們可以將布局文件寫完,然后再include到每個Activity的xml中,這樣確實節省了一些代碼,不用每個頁面都再寫一遍這個布局,但是返回和編輯兩個按鈕都是需要點擊處理的,邏輯代碼基本都一樣。我們還是要每個頁面都處理這兩個按鈕的點擊事件,代碼的復用性又變的很差。

解決類似的問題就用到我們自定控件,把按鈕的點擊事件都寫在自定義控件內,如下:

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中將自定義控件嵌入,點擊按鈕的代碼就都不需要寫了。

三、探究碎片Fragment

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,269評論 25 708
  • Activity的啟動模式 在實際項目中需要根據特定的需求為每一個Activity指定恰當的啟動模式。 啟動模式一...
    寒橋閱讀 988評論 0 0
  • Day1: 在代碼中通過R.string.hello_world可以獲得該字符串的引用; 在XML中通過@stri...
    冰凝雪國閱讀 1,451評論 0 5
  • 夏天剛過去 秋天還沒到 現在是什么顏色 綠的樹紅的花藍的水 你說,明天會是什么顏色 我說,秋天要來了 要來了 只有...
    昔塵閱讀 294評論 0 0
  • 有多少人和我一樣,一直在等一個自己認為是對的人。 就要到凌晨整點時刻,極少在這樣的時間段里,失眠。我突然瘋狂的想念...
    S思閱讀 320評論 0 1