Android中的Intent相信大家都不陌生,它在Android中起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。
一般要实现界面间的跳转,大家都会马上想到Intent,那么Intent怎么在Fragment和Activity中应用,实现两种界面之间的跳转呢?下面贴段代码解释一下:
//这是从Fragment跳转到AActivity,需要获取Fragment所在的Activity来启动Intent
Intent intent = new Intent();
intent.setClass(getActivity(), AActivity.class);
intent.putExtra("intent_A", "你好,我是A");
getActivity().startActivity(intent);
//这是AActivity跳转了多次到CActivity,现在要从CActivity跳转回刚才的Fragment的代码,由于Fragment只是一个片段,所以只能跳转到承载它的MainActivity上
Intent intent = new Intent();
intent.setClass(getApplicationContext(), MainActivity.class);
intent.putExtra("intent_fragmentId", MainActivity.TAB_1);
startActivity(intent);
finish();
再从承载Fragment的MainActivity上启动该Fragment,代码如下:
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
//getIntExtra的原型为getIntExtra(String name, int defaultValue),其中defaultValue为当name对应的值为null时设置的默认值
int id = getIntent().getIntExtra("intent_fragmentId", -1);
if (id == TAB_1) {
viewPager.setCurrentItem(TAB_1, true);
}
}
网上给出的代码大多数到这里就结束了,会跟你说Activity与Fragment直接的跳转就是这样,但实际上这样做会出现问题,就是当你进入到CActivity,结束了当前的操作,跳转到该Fragment之后,只要你执行了这个过程,你就会发现返回键会出现bug,无论你现在进到哪个页面,只要我点击返回键(手机自带的或者左上角的)就会跳到这个Fragment中,那么是什么原因导致这个问题呢?
是因为上面这句话getIntent().getIntExtra("intent_fragmentId", -1);这个额外的Int型数据一直都存在,就像你给一个int型的全局变量赋值之后,无论在哪个地方(当然是在这个全局变量的作用域内)你调用这个全局变量,你都仍然可以获得它的值,以此类推,为了不再强制性的取得这个id,我们应该把intent中的数据移除掉。
根据这个思路,我在上面OnResume函数中添加了一句话,变成下面的代码就可以了。
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
//getIntExtra的原型为getIntExtra(String name, int defaultValue),其中defaultValue为当name对应的值为null时设置的默认值
int id = getIntent().getIntExtra("intent_fragmentId", -1);
if (id == TAB_1) {
viewPager.setCurrentItem(TAB_1, true);
}
getIntent().removeExtra("intent_fragmentId");
}