一、活動的最佳實踐
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");
}
}
);
二、自定義控件簡例
問題背景:我們在項目中都會用到很多公用的控件,比如每個頁面都有標題,如下圖所示,粗略圖:
我們可以將布局文件寫完,然后再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中將自定義控件嵌入,點擊按鈕的代碼就都不需要寫了。