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所需的数据都在方法参数中体现出来了。