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 activities = new ArrayList();
    
    //添加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");
                }
            }
        );

二、自定义控件简例

问题背景:我们在项目中都会用到很多公用的控件,比如每个页面都有标题,如下图所示,粗略图:

10.第一行代码的最佳实践_第1张图片
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

你可能感兴趣的:(10.第一行代码的最佳实践)