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");新闻热点
疑难解答