您的位置:首页 > 其它

关于ViewPager中子Activity生命周期 混乱的问题解决方案

2015-01-23 11:31 417 查看



标签: viewpage 子activity 生命周期混乱

做一个项目的时候,使用的viewpage+activity,刚开始没发现问题,后期发现子activity的onResume()方法一直不调用,从网上查了很多资料才找个解决方案。Google后得知大概是ViewPager中的子Activity"只是用了activity的各个窗口样子,没有将它们加入到AMS中管理"。故无法正确调用生命周期方法。从网上看的也有说通过广播来解决,但是我感觉不是很好,于是耗费了一天时间,在网上飞舞,当看到这位仁兄的见解,才让我茅塞顿开。解决办法是自定义方法来模拟Activity的onResume和onPause,然后在ViewPager所在的父Activity中手动调用子Activity中自定义的伪生命周期方法。

废话不说,上代码:

某子Activity中

public void invisibleOnScreen(){
log.d("invisibleOnScreen");

}

public void goneOnScreen(){
log.d("goneOnScreen");

}

invisibleOnScreen相当于onResume,goneOnScreen相当于onPause
父Activity中

@Override
protected void onResume() {
super.onResume();
log.d("onResume");
mActivityManager.dispatchResume();
if(mViewPager != null){
switch (mViewPager.getCurrentItem()) {
case 0:
Activity _activity = mActivityManager.getActivity(A);
if(_activity != null && _activity instanceof MyActivity){
((MyActivity)_activity ).invisibleOnScreen();
}
break;

default:
break;
}
}

}

因为在给ViewPager设定Adapter时已经使用

mActivityManager.startActivity(tag, intent).getDecorView()

来给每个子Activity设置tag了,所以可以直接用

mActivityManager.getActivity(A);

来获取子Activity 接下来在父Activity的onPause和OnPageChangeListener中手动调用子Acticity的伪生命周期函数即可

可以写个单例模式的类,包每个Activity都存在一个List中,销毁主Activity时也把其他Activity一起销毁

1、既然使用了viewpager 就不在里面使用activity,使用fragment这种带有生命周期的控件,一样可以帮你达到效果

2、使用单例模式

3、让所有的activity都继承一个BaseActivity,然后在baseActiviy里的onCreate 把他们加入到一个list里面去。这样你就可以统一销毁。

或者放到map里面去,你就可以指定销毁

在BlackBerry中,提供了一个管理Screen的栈,用来从任何地方来关闭位于最上一层的Screen,使用UiApplication.getUiApplication().getActiveScreen()来得到位于最上一层的Screen的实例,并且使用UiApplication.getUiApplication().popScreen()来关闭一个Screen或关闭当前最上一层的Screen,但是Android却未提供相应的功能,只能在一个Activity的对象里面调用finish来关闭自己,不能关闭其他的Activity。比如我们想实现一个功能从屏幕A—>屏幕B—>屏幕C—>屏幕D,然后在在转到屏幕D之前将屏幕B和C关闭,在屏幕B和屏幕C界面点击会退按钮都可以回退到上一个屏幕,但是在屏幕D上点击会退按钮让其回退到A,此外在一些循环跳转的界面上如果不在合适的地方将一些不需要的屏幕关闭,那么经过多次跳转后回导致内存溢出。对此我们可以设计一个全局的Activity栈,使用这个栈来管理Activity。管理Activity的类的定义如下:



import java.util.Stack;



import android.app.Activity;



public class ScreenManager {

private static Stack<Activity> activityStack;

private static ScreenManager instance;

private ScreenManager(){

}

public static ScreenManager getScreenManager(){

if(instance==null){

instance=new ScreenManager();

}

return instance;

}

public void popActivity(){

Activity activity=activityStack.lastElement();

if(activity!=null){

activity.finish();

activity=null;

}

}

public void popActivity(Activity activity){

if(activity!=null){

activity.finish();

activityStack.remove(activity);

activity=null;

}

}

public Activity currentActivity(){

Activity activity=activityStack.lastElement();

return activity;

}

public void pushActivity(Activity activity){

if(activityStack==null){

activityStack=new Stack<Activity>();

}

activityStack.add(activity);

}



public void popAllActivityExceptOne(Class cls){

while(true){

Activity activity=currentActivity();

if(activity==null){

break;

}

if(activity.getClass().equals(cls) ){

break;

}

popActivity(activity);

}

}

}





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: