android2.2的LocalActivityManager的destroyActivity()问题

   

      今天在用ActivityGroup做例子,发现了个问题,并采用了个笨办法暂时解决。

      首先看LocalActivityManager的destroyActivity()的源码:

     

/**
     * Destroy the activity associated with a particular id.  This activity
     * will go through the normal lifecycle events and fine onDestroy(), and
     * then the id removed from the group.
     * 
     * @param id Unique identifier of the activity to be destroyed
     * @param finish If true, this activity will be finished, so its id and
     * all state are removed from the group.
     * 
     * @return Returns the window that was used to display the activity, or
     * null if there was none.
     */
    public Window destroyActivity(String id, boolean finish) {
        LocalActivityRecord r = mActivities.get(id);
        Window win = null;
        if (r != null) {
            win = performDestroy(r, finish);
            if (finish) {
                mActivities.remove(r);
            }
        }
        return win;
    }


        大家可能已经发现remove的时候,错误,应该是remove(id)。不知道google的错误,还是故意这么做,不让删除。

        这样以来在调用destroyActivity就没法删除,这样在做ActivityGroup的返回就会出错误。

        具体ActivityGroup中Activity的返回代码如下:

       

@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		
		if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP){
			onBackPressed();
		}
		return super.onKeyDown(keyCode, event);
	}
	public void onBackPressed() {
		if(index>1){
			activityManager.destroyActivity((index)+"", true);
			boolean isWhile = true;
			while(isWhile){
				Activity activity = activityManager.getActivity((--index)+"");
				if(activity!=null){
					startActivityBack(activity);
					isWhile = false;
					break;
				}
			}
		}else{
			super.onBackPressed();
		}
	}


        一下是在ActivityGroup中start和back调用的方法:

       

private int index = 0;
	
	public void startActivityForGroup(Intent intent) {
		boolean isWhile = true;
		while (isWhile) {
			Window window = activityManager.startActivity(
					(++index)+"", intent);
			Log.d(TAG, "==window:"+window);
			Log.d(TAG, "==CurrentId:"+index);
			if(window!=null){
				isWhile = false;
				View decorView =window.getDecorView();
				contentView.removeAllViews();
				contentView.addView(decorView);
				break;
			}
		}
	}
	
	public void startActivityBack(Activity activity){
		if(activity.getWindow()==null)
			return;
		System.out.println("==view:"+activity.getWindow().getDecorView());
		contentView.removeAllViews();
		contentView.addView(activity.getWindow().getDecorView());
		
	}

          这样,暂时能够保持正常返回。但是存在隐患。希望大家能够交互方法,让我们的代码更加完善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值