一颗胡、活動(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)題,如下圖所示雁佳,粗略圖:
我們可以將布局文件寫完脐帝,然后再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)擊按鈕的代碼就都不需要寫了。