活动的最佳实践
ps:以下代码都没有导包,需要自己导包(快捷键:ALT+ENTER);
准备代码:
新建活动FirstActivity.java(主活动) 新建对应布局文件 activity_first.xml (布局文件里面需要button来启动下一个页面);
新建活动SecondActivity.java 新建对应布局文件 activity_second.xml (同上);
新建活动ThirdActivity.java 新建对应布局文件 activity_third.xml(最后一个页面可以不设置按钮);
1.知晓目前是哪个活动
在当前包名下 新建一个BaseActivity类(不需要在AndroidManifest.xml中注册),并继承AppCompatActivity,重写onCreate()方法. 在onCreate()方法中取得当前实例的类名,并打印出来;
public class BaseActivity extends AppCompatActivity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity",getClass().getSimpleName());
}
接下来让BaseActivity成为所有Activity的父类,让FirstActivity ,SecondActivity , ThirdActivity 不再继承AppCompatActivity,而是继承BaseActivity,点击按钮依次进入三个活动对应的页面,观察Logcat,得到当前打开页面的名称;
2.随时随地的退出程序
当打开页面过多时,需要点击很多次Back按钮才能退出程序,这时候我们需要一个能随时退出程序的方案;
解决思路:需要一个专门的集合类对所有活动进行管理;
新建一个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();
}
}
activities.clear();
}
}
在活动管理器中,通过一个List来暂存活动,然后提供一个add(activity)方法来向List中添加活动,提供一个remove(activity)来从List中删除一个活动,提供一个finish()方法来将List中的所有活动销毁;
接下来修改BaseActivity中的代码:
public class BaseActivity extends AppCompatActivity{
@Override
protected void onCreate(@Nullable 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中重写onDestory,并调用ActivityCollector的removeActivity()方法,表明将一个需要销毁的活动从活动管理器中移除;
这样设置之后,想要在那个活动里面退出程序,只需要直接调用ActivityCollector.finishAll()方法就可以了;
例如:
在ThirdActivity中通过一个按钮来退出程序;
public class ThirdActivity extends BaseActivity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
Button button3 = (Button) findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ActivityCollector.finishAll();
android.os.process.killProcess(android.os.process.myPid());//杀掉当前进程
}
});
}
}
我们在销毁所有活动的代码后面,可以加上杀掉当前进程的代码,来保证程序完全退出;killProcess()方法接收一个进程id参数,通过myPid()来获得这个参数;killProcess()方法只能杀掉当前程序的进程,不能使用这个方法来杀掉其他程序的进程;
杀掉其他程序的进程可以用下面的代码;(感觉比较流氓)
ActivityManager manager=(ActivityManager)getSystemService(ACTIVITY_SERVICE);
manager.killBackgroundProcesses("packageName");
3.启动活动的最佳方案
按照正常的额启动方法,需要用Intent来完成,但是在实际开发中,我们用另一种方法,这种方法可以让你节约你去阅读别人代码的时间和别人来询问你的时间;
修改SecondActivity中的代码:
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;
接下来修改FirstActivity中的代码:
button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SecondActivity.actionStart(FirstActivity.this,"This is data1","this is data2"); } });只需要一行代码就可以启动SecondActivity;