本篇共四部分内容:
- 活动被回收了怎么办
- 知道当前在哪个活动中
- 随时随地退出活动
- 启动活动的最佳写法
活动被回收了咋办
当A活动中启动了活动B,然后A活动由于内存不足被回收,此时按下BACK键会正常显示A活动,只不过这时不会执行onRestore方法,而是执行A的onCreate方法,此时活动中A的临时数据和状态将丢失。如何应对这种情况?
onSaveInstanceState();
他携带一个bundle类型的数据, bundle提供了一系列的方法用于保存数据,比如可以使用putString方法保存字符串,使用putInt()方法保存整数数据。
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String s="I AM BACK";
outState.putString("key",s);
}
这样数据就保存下来了,然后在使用的时候在onCreate中恢复
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState!=null){
String key=savedInstanceState.getString("key");
}
}
知道当前在哪个活动中
这个其实挺简单,新建一个BaseActivity类继承Activity,复写onCreate方法
public class BaseAcitvity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("date","BaseActivity: "+getClass().getSimpleName());//打印所在活动名称
}
}
然后新建其他的活动再继承BaseActivity复写onCreate方法就可以通过debug看到当前时哪个活动了。
随时随地退出活动
新建一个类,用于管理活动。
public class ActivityCollector {
private static ArrayList<Activity> activities = new ArrayList<>();
/**
* 将activity添加到list中
* @param activity
*/
public static void getActivity(Activity activity) {
activities.add(activity);
}
/**
* 从list中移除activity
* @param activity
*/
public static void removeActivity(Activity activity) {
activities.remove(activity);
}
/**
* 移除所有的activities
*/
public static void finishAll() {
for (Activity activity : activities) {
// 判断活动是否finish
if (!activity.isFinishing()) {
activity.finish();
}
}
}
}
每次打开一个活动的时候都将活动添加到list中,destory的时候移出list中
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
ActivityCollector.getActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
然后在任意位置调用活动管理类中的关闭所有活动的方法来关闭所有添加到list中的活动。
ActivityCollector.finishAll();//关闭所有的界面
完成
启动活动的最佳写法
团队合作中,1要打开2负责的活动并传递参数,1要么自己看2写的活动的代码,要么直接问2,这样的话的确就是降低了工作的效率。
下面通过2在活动中写一个打开活动的静态方法来解决此问题。
首先在2负责的活动中写一个静态方法
/**
* 用于活动二调用的intent
* @param context 传入活动二的context
* @param date 传入活动二的数据
*/
public static void actionIntent(Context context,String date){
Intent intent =new Intent(context,ThridActivity.class);
intent.putExtra("date",date);
context.startActivity(intent);
}
然后1在打开2的活动的时候直接调用这个静态方法,这样要传递什么参数就一目了然了。
ThridActivity.actionIntent(SecondActivity.this,"你好");//调用活动三写好的开启方式
本篇结束。