开发者

When going back through activities, application stalls

开发者 https://www.devze.com 2023-04-12 19:21 出处:网络
I have this code, that goes through steps, aquired from a webservice. I implemented my own history, so that the user can go back through performed steps.

I have this code, that goes through steps, aquired from a webservice.

I implemented my own history, so that the user can go back through performed steps. The problem is that the same step can be visited more than once and that seems to cause my history to fail.

It can go back just fine, but sometimes it takes more than one press on the back button to go to the previous step.

Here's the code for my class that manages history:

private ArrayList<String> idList;

@Override
public void onCreate( Bundle savedInstanceState )
{
    super.onCreate( savedInstanceState );
    if ( idList == null )
    {
        idList = new ArrayList<String>();
    }
}

@Override
public void finishFromChild( Activity child )
{
    LocalActivityManager manager = getLocalActivityManager();
    int index = idList.size()-1;

    if ( index < 1 )
    {
        finish();
        return;
    }

    manager.destroyActivity( idList.get( index ), true );
    idList.remove( index ); index--;
    String lastId = idList.get( index );
    Activity lastActivity = manager.getActivity( lastId );
    Intent lastIntent = lastActivity.getIntent();
    Window newWindow = manager.startActivity( lastId, lastIntent );
    setContentView( newWindow.getDecorView() );
}

public void startChildActivity( String id, Intent intent )
{
    id += System.currentTimeMillis();
    if ( "restart".equalsIgnoreCase( id ) )
    {
        idList.clear();
    }

    Window window = getLocalActivityManager().startActivity( id, intent.addFlags( Intent.FLAG_ACTI开发者_Go百科VITY_CLEAR_TOP ) );
    if ( window != null )
    {
        idList.add( id );
        setContentView( window.getDecorView() );
    }
}

public Activity getCurrentActivity()
{
    int length = idList.size();
    if ( idList.isEmpty() ) {
        return null;
    }
    else
    {
        return getLocalActivityManager().getActivity( idList.get( length-1 ) );
    }
}

@Override
public boolean onKeyDown( int keyCode, KeyEvent event )
{
    if ( keyCode == KeyEvent.KEYCODE_BACK )
    {
        return true;
    }
    return super.onKeyDown( keyCode, event );
}

@Override
public boolean onKeyUp( int keyCode, KeyEvent event )
{
    if ( keyCode == KeyEvent.KEYCODE_BACK )
    {
        onBackPressed();
        return true;
    }
    return super.onKeyUp( keyCode, event );
}

@Override
public void onBackPressed()
{
    int length = idList.size();
    if ( length > 1 )
    {
        Activity current = getLocalActivityManager().getActivity( idList.get( length-1 ) );
        current.finish();
    }
}


Turns of that the FLAG_ACTIVITY_CLEAR_TOP flag

in my method

public void startChildActivity( String id, Intent intent )
{
id += System.currentTimeMillis();
if ( "restart".equalsIgnoreCase( id ) )
{
    idList.clear();
}

Window window = getLocalActivityManager().startActivity( id, intent.addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP ) );
if ( window != null )
{
    idList.add( id );
    setContentView( window.getDecorView() );
}

}

Was messing things up, now everything is working perfectly.

0

精彩评论

暂无评论...
验证码 换一张
取 消