一、活动的启动模式
1、启动模式有四种,分别是standard,singleTop,singleTask,singleInstance。可以在注册活动中通
2、standard是活动默认的启动模式(没有显示指定时就执行这个模式)。该模式下每启动一个新活动,它就会在返回栈中并处于栈顶位置(无论返回栈中是否已经存在这个活动),每次启动都会创建该活动的一个新实例。
3、singleTop模式下,如果发现返回栈的栈顶已经是该项活动,则不会重新创建实例而是直接使用栈顶的活动。但如果栈顶以外存在相同的活动而栈顶不是该项活动,一样会重新创建新活动到栈顶。
4、singleTask模式下每次启动该活动时系统首先会在返回栈中检查是否存在该活动实例,如果发现已经存在则直接使用该实例并把在这个活动之上的所有活动统统出栈,如果没有就创建一个新实例。
5、singleInstance模式的活动会启用一个新的返回栈来管理这个活动,无论是哪个应用程序访问这个活动都共用这同一个栈。
二、知晓非自己编写的项目正在运行的是哪一个活动
1、首先创建一个继承AppCompatActivity的Java class。右击example.activitytest包→New→Java class,设置name为BaseActivity,super class为AppCompatActivity。
2、在这个Java class里写的程序如下:
public class BaseActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity",getClass().getSimpleName());
}
}
使其的子类都会在日志上打印出它的名称
3、最后把每一个继承AppCompatActivity的活动都替换成继承BaseActivity,由于BaseActivity继承AppCompatActivity,所以活动的一切运行都不会受影响,反而会在日志里面执行Log.d("BaseActivity",getClass().getSimpleName()),打印每一个活动的应用显示名称,然后就能把实际应用的各个活动和那么多项活动代码对上号。
三、随时随地退出程序
1、当程序打开多个活动时(即返回栈有多个活动),要完全退出程序要按多次back键,home键也只能让程序在后台挂起。为了方便退出程序,我们可以设置一键退出程序。
2、首先,新建一个ActivityCollector类作为活动管理器:
public class ActivityCollector {
public static List activities=new ArrayList<>();//用List暂存活动
public static void addActivity(Activity activity){ //addActivity方法添加活动到管理器
activities.add(activity);
}
public static void removeActivity(Activity activity){ //removeActivity方法在管理器移除活动
activities.remove(activity);
}
public static void finishALL(){ //finishALL方法结束所有管理器里面的活动即关闭程序
for (Activity activity:activities){
if(!activity.isFinishing()){
activity.finish();
}
}
}
}
3、调用活动管理器:
public class BaseActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) { //onCreate即活动创建时活动添加到活动管理器
super.onCreate(savedInstanceState);
Log.d("BaseActivity",getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy(){ //onDestroy即活动将要被销毁时从活动管理器移除
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
BaseActivity 的父类是 AppCompatActivity,即活动的父类是BaseActivity的都会执行上面的活动管理器,因此不同程序不应用同一个BaseActivity父类,否则将一键同时关闭两个程序。
4、最后,在父类为BaseActivity的活动中添加按键触发代码,调用ActivityCollector.finishALL();这行代码,程序所有以BaseActivity为父类的活动(即在活动管理器的活动)全部被销毁(即退出程序)。
*5、销毁所有活动代码后面可以再加上杀掉当前进程的代码(以保证程序完全退出):
@Override
public void onClick(View v) {
ActivityCollector.finishALL();
android.os.Process.killProcess(android.os.Process.myPid());
}
killProcess()方法用于杀掉一个进程,它接收一个进程id参数,可以通过myPid()方法获取当前进程的id。注意:killProcess()只能用于杀掉当前进程,无法杀掉其他程序。
*四、最佳的启动活动方法
public class secondActivity extends AppCompatActivity {
public static void actionStart(Context context,String data1,String data2){
Intent intent = new Intent(context,secondActivity.class);
intent.putExtra("param1",data1);
intent.putExtra("param1",data2);
context.startActivity(intent);
}
}
在secondActivity 代码里引用了actionStart方法传入了打开secondActivity所需要的数据,这样一来,在别的活动要打开secondActivity时就只需要一行代码:
secondActivity .actionStart(FirstActivity.this,"data1","data2");
此外,程序员也能对secondActivity所需要的数据一目了然,不需要过度的询问也可操纵。