本文介绍几种关于活动的实践技巧。
项目代码继续基于《安卓开发——活动的启动模式》
一、知晓当前在哪个活动
新建一个Java Class
:BaseActivity
,并让它继承AppCompatActivity
,为啥要继承这个可以参考这里或者书的第21页。
接下来重写onCreate()
,可以看到通过getClass().getSimpleName()
打印了当前实例的类名:
public class BaseActivity extends AppCompatActivity {
private static final String TAG = "BaseActivity";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, getClass().getSimpleName());
}
}
接下来只要分别让FirstActivity
等不再继承AppCompatActivity
,而是继承BaseActivity
,那么就能知晓当前界面对应的是哪个活动了。
PS:个人觉得这种方法并不好,其修改了原项目的代码继承的类,如果人家的已经继承其他类了呢?这种情况称为适配器,个人还是推荐使用装饰器模式。
二、随时随地退出程序
退出通常是连续按下BACK
键,按下HOME
只会将应用挂起,并未退出。那么怎么退出呢?只要用一个集合类对所有活动进行管理就可以了。
新建一个ActivityCollector
类作为活动管理器:
public class ActivityCollector {
private 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
暂存活动,然后用几个方法控制这些活动。接下来修改BaseActivitiey
的代码:
public class BaseActivity extends AppCompatActivity {
private static final String TAG = "BaseActivity";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
这样BaseActivity
就会将活动添加或移除到活动管理器里,如果想要退出程序,只需要调用ActivityCollector.finishAll()
即可。
给我们的ThirdActivity
添加按钮监视器用来退出所有活动:
public class ThirdActivity extends BaseActivity {
private static final String TAG = "ThirdActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_third);
Log.d(TAG, "id是"+getTaskId());
Button button3 = (Button)findViewById(R.id.button_3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ActivityCollector.finishAll();
}
});
}
}
运行一下,完美退出:
为了确保程序完全退出,还可以再加一句代码杀掉进程:
android.os.Process.killProcess(android.os.Process.myPid());
就会杀掉当前程序的进程了。
三、漂亮地启动活动
关于启动活动之前在这里写过:《Android开发——intent在活动间穿梭》
也可以用Intent在活动间传递数据:《Android开发——intent在活动间传递数据》
加入要启动一个其他的活动,传递数据用intent.putExtra(键值,数据)
的方式没什么问题,但在开发别人的项目时,我们尚不清楚启动其他活动到底要传递哪些数据。这时,要么老老实实阅读其他活动的代码,要么去问写那个活动的同事,这样岂不是很麻烦?
于是,还有种写法,在要启动的活动(比如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);
}
我们在自己的活动中添加了actionStart()
这个方法,完成了Intent
的构建,其中需要的所有数据都通过该方法的参数传递进来,然后再启动SecondActivity
。
这样就不阅读SecondActivy
也能一目了然的知道了需要哪些数据,甚至还简化了启动代码:
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SecondActivity.actionStart(FirstActivity.this, "data1", "data2");
}
});
Beautiful !