Activity跳转是指在一个Android应用程序中从一个Activity跳转到另一个Activity的过程。
举个例子,你可能从一个主Activity启动另一个Activity以显示其他应用程序的内容,如电子邮件数据或者Web内容,或者从一个Activity启动另一个Activity以响应用户与UI组件交互时的事件,如单击按钮或选择菜单项。
2.如何进行activity跳转?
在Android应用程序中,开发者可以通过以下方法进行Activity跳转:
2.1 通过Intent进行Activity跳转
Intent是Android应用程序之间或同一应用程序中组件之间交互的主要方式。
在启动另一个Activity时,开发者需要创建一个Intent对象并使用其中的startActivity方法启动另一个Activity。
例如:
// 创建Intent,指定要跳转的Activity
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
// 启动Intent
startActivity(intent);

在这个例子中,MainActivity是当前的Activity,而SecondActivity是要跳转到的Activity。MainActivity通过创建一个Intent对象并使用startActivity方法启动SecondActivity。
2.2 通过显式启动和隐式启动进行Activity跳转
显式启动是通过向Intent添加目标组件的完整类名来启动Activity。例如:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
隐式启动是指在Intent中指定一些数据,让系统根据这些数据来决定哪个Activity可以响应这个Intent。例如:
Intent intent = new Intent();
// 指定action
intent.setAction("android.intent.action.VIEW");
// 指定URI
intent.setData(Uri.parse("http://www.google.com"));
startActivity(intent);
在这个例子中,开发者创建了一个Intent,指定了要查看URI的操作,以及URI的内容。当具有处理这种类型Intent的Activity存在时,系统会使用此Intent来启动该Activity。

2.3 在Activity之间使用 startActivityForResult
startActivityForResult是一种重载的startActivity方法,它用于在Activity之间进行“有返回值”的跳转。当目标Activity完成其任务后,它会向调用Activity返回一个结果。例如:
// 创建Intent,指定要跳转的Activity
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
// 启动Intent,并等待结果返回
startActivityForResult(intent, 1);
在这个例子中,MainActivity通过创建一个Intent对象并使用startActivityForResult方法启动SecondActivity,并等待从SecondActivity返回结果。
3. 如何在Activity之间传递数据?
在Android中,在Activity之间传递数据非常重要。开发者可能需要将用户登录信息传递给下一个Activity,或者传递其他应用程序提供的数据。以下是在Activity之间传递数据的常见方式:
3.1 使用Intent传递数据
Intent提供了一个setData和getData方法,用于传递URI或数据。例如,通过setData方法来传递URI:

Intent intent = new Intent();
intent.setData(Uri.parse("http://www.google.com"));
startActivity(intent);
开发者还可以使用putExtra方法来将整数、字符串和其他数据类型置于Intent中作为参数。
例如:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
// 传递字符串
intent.putExtra("name","张三");
// 传递整型
intent.putExtra("age",25);
startActivity(intent);
可以在SecondActivity中使用getIntent方法获取传递的参数。
例如:
Intent intent = getIntent();
String name = intent.getStringExtra("name");
int age = intent.getIntExtra("age", 0);
3.2 使用Bundle传递数据
Bundle是用于在Activity之间传递数据的另一种方式。开发者可以使用Bundle传递Java对象或其他数据类型。
例如:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();

// 传递字符串
bundle.putString("name", "张三");
// 传递整型
bundle.putInt("age", 25);
intent.putExtras(bundle);
startActivity(intent);
在SecondActivity中可以使用getIntent方法获取Intent对象,然后使用getExtras获取Bundle对象。
例如:
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String name = bundle.getString("name");
int age = bundle.getInt("age");
通过对上述内容的说明,我们可以很好的了解Activity跳转的方法和方式。在Android应用程序中跳转Activity对于开发者来说非常重要和有用,如此可以为用户提供更加丰富的交互方式和更加复杂的应用场景,增强应用程序的吸引力和可用性。
Activity和Fragment都是Android中的基本组件。Activity代表屏幕上的单个视图,可以包含用户界面元素,如按钮、文本框、图像、列表等。Fragment是Activity中的一部分,它代表屏幕上的一个可重用的子部件,可以嵌入Activity中的布局。Activity可以通过跳转到不同的Fragment,来实现不同的界面和功能。

2. Activity跳转Fragment的方式
Activity跳转Fragment有多种方式,包括:
(1)通过Activity跳转Fragment时传递参数:在Activity中使用Bundle传递参数,然后在Fragment中获取这些参数。例如:
Intent intent = new Intent(this, MyFragmentActivity.class);
Bundle bundle = new Bundle();
bundle.putString("name", "Activity跳转Fragment");
MyFragment fragment = new MyFragment();
fragment.setArguments(bundle);
getFragmentManager().beginTransaction().replace(R.id.container, fragment).addToBackStack(null).commit();
在Fragment中使用getArguments()方法获取参数:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
if(bundle != null){
String name = bundle.getString("name");
}
}
(2)通过回调接口进行Activity与Fragment间的通信:通过在Activity中实现一个回调接口,在Fragment中调用该接口,实现Activity与Frament间的双向通信。例如:

Activity代码:
public class MainActivity extends AppCompatActivity implements MyFragment.OnFragmentInteractionListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyFragment fragment = MyFragment.newInstance();
getSupportFragmentManager().beginTransaction().add(R.id.container, fragment).commit();
}
@Override
public void onFragmentInteraction(String params) {
Log.d("MainActivity", "from fragment:" + params);
}
}
Fragment代码:
public class MyFragment extends Fragment {
private OnFragmentInteractionListener mListener;
public MyFragment() {
// Required empty public constructor
}
public static MyFragment newInstance() {
MyFragment fragment = new MyFragment();
return fragment;

}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_my, container, false);
view.findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mListener != null) {
mListener.onFragmentInteraction("from Fragment");
}
}
});
return view;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()

+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnFragmentInteractionListener {
void onFragmentInteraction(String params);
}
}
(3)使用FragmentTransaction进行跳转:通过在Activity中获取FragmentManager对象,使用FragmentTransaction进行跳转。例如:
MyFragment fragment = new MyFragment();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container, fragment);
transaction.addToBackStack(null);
transaction.commit();
在Fragment中可以通过getActivity()获取当前所在的Activity对象。例如:
@Override
public void onClick(View v) {
((MainActivity)getActivity()).method();

}
3. Activity跳转Fragment需要注意的问题
(1)Activity的销毁生命周期对应Fragment的什么生命周期?
Activity的销毁生命周期将对应Fragment的onDetach()生命周期,即当Activity销毁时,Fragment会执行onDetach()方法。在这个方法中,可以将Activity中引用的Fragment对象置空。
(2)Fragment在跳转时,如何保留现场?
当Activity中有多个Fragment并且它们界面相似,不同之处只是数据不同,这时需要保留现场。可以在Fragment中通过setRetainInstance(true)实现该功能。例如:
public class MyFragment extends Fragment {
private String mData;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment_layout, null);
TextView textView = view.findViewById(R.id.text_view);
if (mData != null) {
textView.setText(mData);
} else {
mData = https://xitong.haoyundao.net/"hello world";
textView.setText(mData);
}
return view;
}
}
setRetainInstance(true)的执行效果是,在Fragment销毁重建时,原有的Fragment实例会被复用,而不是重新创建。因此,在销毁重建时,Fragment的onCreateView()方法不会被再次执行,而是直接复用原有的View视图。
(3)Fragment在重叠显示时可能会出现什么问题?
当Activity中有多个Fragment并且它们都处于onResume()状态时,同时其中某些Fragment与其他Fragment重叠显示在同一个位置上,这时就可能出现重叠现象。为了解决这个问题,可以在onPause()方法中使用FragmentTransaction的detach()方法将Fragment的视图从Activity中移除,然后在onResume()方法中使用attach()方法重新添加到Activity中。例如:
public class MyFragment extends Fragment {
@Override
public void onPause() {
super.onPause();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.detach(this);
transaction.commit();
}
@Override
public void onResume() {
super.onResume();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.attach(this);
transaction.commit();
}
}
4. 总结
Activity跳转Fragment是实现Android应用界面功能的基本操作之一,本文主要介绍了Activity跳转Fragment的相关方式和注意事项。掌握这些知识,能够更好地实现Android应用的开发和调试。







