先说需求吧:应用当前在FirstFragment,然后回到桌面,然后回到应用,回到应用需要显示SecondFragment
然后说下实现:Activity启动模式是singleTask,这样再次启动会走onNewIntent ,然后再onNewIntent里处理intent,根据传过来的type来显示Fragment。
说下问题: 每次回来的时候会看到FirstFragment切换到SecondFragment的痕迹,就是会短暂的显示一下FirstFragment再切换到SecondFragment。
下面是实现代码:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private FirstFragment mFirstFragment;
private SecondFragment mSecondFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFirstFragment = new FirstFragment();
mSecondFragment = new SecondFragment();
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart: ");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart: ");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume: ");
}
public void toFirstFragment(View view){
switchFragment(mFirstFragment);
}
public void toSecondFragment(View view){
switchFragment(mSecondFragment);
}
private Fragment lastOneFragment = null;
private void switchFragment(Fragment currentFragment) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if(!currentFragment.isAdded()){
transaction.add(R.id.layout_container,currentFragment);
}
if (lastOneFragment!=null){
transaction.hide(lastOneFragment);
}
lastOneFragment=currentFragment;
transaction.show(currentFragment);
transaction.commit();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d(TAG, "onNewIntent: ");
processIntent(intent);
}
private void processIntent(Intent intent) {
int type = intent.getIntExtra("type", 0);
Log.d(TAG, "processIntent: type = "+type);
switch (type){
case 1:
switchFragment(mFirstFragment);
break;
case 2:
switchFragment(mSecondFragment);
break;
}
}
}
下面是输出的log:
2019-01-01 09:50:37.044 11798-11798/com.example.fragmenttest D/MainActivity: onNewIntent:
2019-01-01 09:50:37.044 11798-11798/com.example.fragmenttest D/MainActivity: processIntent: type = 2
2019-01-01 09:50:37.062 11798-11798/com.example.fragmenttest D/SecondFragment: onStart:
2019-01-01 09:50:37.066 11798-11798/com.example.fragmenttest D/MainActivity: onResume:
2019-01-01 09:50:37.068 11798-11798/com.example.fragmenttest D/FirstFragment: onResume:
2019-01-01 09:50:37.069 11798-11798/com.example.fragmenttest D/SecondFragment: onResume:
你这个:每次回来的时候--->指的是在其他Activity回到MainActivity吗?
从你的日志,走了onNewIntent,然后对页面进行了切换了。
如果你的日志是一次个动作的日志,你这里的确经历了页面的可见。你打个断点即可。
回桌面先全部hide?
下面是A8和A9的gif,可以明显看到A9起来有蓝色闪了一下
蓝色是FristFragment,红色是SecondFragment
A8
A9
既然你想要不看到FirstFragment,那么可以在回到桌面的时,就把Fragment 切换到SecondFragment,那么到时再次回到应用的时候,就是直接显示SecondFragment