Activity的启动模式
Activity的启动模式由四种:standard,singleTop,singleTask和singleInstance。可以在AndroidManifest.xml中给activity标签指定android:launcherMode属性来选择启动模式。
standard是默认的启动方式,所有的启动的activity都只存在一个栈当中,并且遵循先进后出的原则。
<activity android:launcherMode:"standard">//默认存在,可加可不加
</activity>
singleTop:当活动的启动模式指定为singleTop,在启动活动时如果发现返回栈顶已经是该活动,则可以直接使用,不会创建新的活动实例。
<activity android:launcherMode:"singleTop">
</activity>
但是如果有B活动进入了同一个栈,而B活动又可以重新建立之前的A活动的话,这时候A活动会被新建一个实例,这样也会影响用户的体验。也就是说singleTop可以很好的解决重复创建栈顶活动的问题,但是活动没有处于栈顶的位置还是可能创建多个活动实例。
singleTask:每次启动A活动时系统先会在返回栈中检查是否存在A活动的实例,如果没有发现已经存在则直接使用该实例,并把这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的A活动实例。
<activity android:launcherMode: "singleTask">
</activity>
singleInstance:设置了该模式的activity会在每次启动的时候会启用一个新的返回栈来管理该活动,可以实现共享活动实例的问题:
<activity android:launcherMode:"singleInstance">
</activity>
知晓当前启动那个活动
主要方法:
getClass().getSimpleName();
实现过程代码:
先创建一个新的BaseActivity,并继承Activity,在onCreate()中写入以下代码:
log.i("TAG", getClass().getSimpleName());
然后把各个activity的的继承关系改为BaseActivity,这样就相当于每个activity在启动的时候走先走父类的onCreate方法,执行打印语句,打印出当前的活动名称。
通过指定方式退出活动
创建一个新的类:
public class ActivityCollection{
public static void addActivity(Activity activity){
activities.add(activity);
}
public static void removeActivity(Activity activity){
activities.remove(activity);
}
public static void finishActivity(){
for(Activity activity : activities){
if(!activity.isFinishing()){
activity.finish();
}
}
}
}
在BaseActivity的onCreate、onDestroy方法中调用addActivity、removeActivity的方法,就是在每次启动子活动的时候都可以在List添加Activity元素或者杀死一个Activity,若要在某个特定的活动中通过某个特定的方式杀死一个活动则调用finishActivity方法:
ActivityCollection.finishActivity();
启动活动的小技巧
当一个活动中需要用到一些重要的参数,需要启动活动的时候必须传递进来,那我们最好在需要启动的活动中添加如下代码,方便后来者或自己知道要传入什么类型的参数:
public static void actionActivity(Context context, String data1, String data2){//这里参数不一定是String,根据具体情况而定。
Intent intent = new Intent(context, SecondActivity.class)
intent.putExtra("param1", data1);
intent.putExtra("param2", data2);
context.startActivity(intent);
}
在启动需要参数的活动的时候只要调用相应的方法并传入参数即可:
SecondActivity.actionActivity(FristActivity.this, "data1", "data2");