天天看点

活动的最佳实践——一些小技巧

0.知晓当前界面是哪个活动

新建一个BaseActivity类,让BaseActivity继承AppActivity,重写onCreate()方法,代码如下:

public class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        Log.d("BaseActivity",getClass().getSimpleName());
    }
}
           

我们在onCreate()方法中获取了当前实例的类名,并通过logcat打印出来。

接下来我们需要让BaseActivity成为ActivityTest项目中所有活动的父类,修改FirstActivity,SecondActivity,ThirdActivity的继承结构,让他们不再继承自AppCompatActivity,而是继承自BaseActivity,由于BaseActivity继承自AppCompaActivity,所以项目中所有活动的现有功能不会受影响,运行程序,查看日志信息:

活动的最佳实践——一些小技巧
活动的最佳实践——一些小技巧
活动的最佳实践——一些小技巧

每当我们进入到个活动的界面,该活动的类名就会被打印出来。

1.随时随地退出程序

新建一个集合类ActivityCollector作为活动管理器管理所有活动,代码如下:

public class ActivityCollector {
    public static List<Activity> activities = new ArrayList<>();
    public static void addActivity(Activity activity){
        activities.add(activity);
    }
    public static void removeActivity(Activity activity){
        activities.remove(activity);
    }
    public static void finishAll(){
        for (Activity activity : activities){
            if (!activity.isFinishing()){
                activity.finish();
            }
        }
    }
}
           

在活动管理器中,通过一个List开暂存活动,然后提供一个addActivity()方法用于向List中添加活动,提供一个removeActivity()方法用于从List中删除活动,最后提供一个finishAll()方法用于将List中储存的活动全部销毁。

接下来修改BaseActivity中的代码,代码如下:

public class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        Log.d("BaseActivity",getClass().getSimpleName());
        ActivityCollector.addActivity(this);
    }
    @Override
    protected void onDestroy(){
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
}
           

在BaseActivity的onCreate()方法中调用了ActivityCollector的addActivity()方法,表明将当前正在创建的活动添加到活动管理器中,然后在BaseActivity中重写onDestroy()方法,并调用ActivityCollector的removeActivity()方法,表明将一个马上要销毁的活动从活动管理器中移除。

2.启动活动的最佳写法 

假设SecondActivity中需要两个字符串参数,在启动SecondActivity时必须传递过来

传统写法:

Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("param1","data1");
intent.putExtra("param2","data2");
startActivity(intent);
           

问题来了,如果SecondActivity不是你写的,但你负责的部分需要有启动SecondActivity这个功能,而你不清楚启动这个活动需要传递哪些数据,怎么搞?两个办法,一,去看SecondActivity的代码,二,去问写SecondActivity的同事,嘿麻烦。

最佳写法:

public class SecondActivity extends BaseActivity{
    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中添加了一个actionStart()方法,在这个方法里完成了intent的构造,另外所有SecondActivity中需要的数据都是通过actionStart()这个方法的参数传递过来的,然后把它们存储到Intent中,最后调用startActivity()方法启动SecondActivity。

这样写的好处是SecondActivity所需的数据都在方法参数中体现出来了。