Intent intent = new Intent(this,MainListActivity.class);
startActivity(intent);
Intent intent = new Intent(this,MainListActivity.class);
// 可直接调用putXxx()方法 或 创建Bundle对象,完成参数传递
intent.putString(TAG,"data");
intent.putExtra(TAG,0);
...
startActivity(intent);
这样传递没什么问题,为了更好地实现模块独立,我们可以在被启动的Activity(MainListActivity)中创建一个static方法来启动。把传递的参数放到newIntent()方法的参数中传递,这样需要启动DetailActivity的Activity就不用处理具体的业务逻辑,相关的操作都由DetailActivity实现。
public static final String EXTRA_CRIME_ID = "com.demo.happy.criminal.crime_id";
// 需要传递的数据,直接放在参数中即可
public static Intent newIntent(Context packageContext, UUID crime_id){
Intent intent = new Intent(context,DetailActivity.class);
intent.putExtra(EXTRA_CRIME_ID,crime_id);
return intent;
}
这样我们只需在DetailActivity中调用newIntent(),该方法传入需要传递的数据即可
Intent intent = DetailActivity.newIntent(getActivity(),crimeId);
startActivity(intent);
Fragment启动Activity类似于Activity启动Activity,直接调用fragment.startActivity(Intent),然后在后台触发调用对应的Activity方法。
和Activity中启动方法一样,此处代码省略
在实际应用中,我们不仅要启动某个Activity或者Fragment,更多是它们之间的数据传递。
把所需要的参数作为newIntent()的参数传递过去
Fragment
Intent intent = MainActivity.newIntent(getActivity(), id);
Activity
public static Intent newIntent(Context context, UUID crime_id){
Intent intent = new Intent(context,MainActivity.class);
intent.putExtra(EXTRA_CRIME_ID,crime_id);
return intent;
}
首先呢,我们可以通过Intent,直接携带参数传递,简单、方便。然而这种方法破坏了fragment的封装性,MainFragment不再是独立的构建单元,因为它现在由某个特定的activity托管,该activity的Intent定义了EXTRA_CRIME_ID的Extra无法在适用于其他任何activity
Activity
public static Intent newIntent(Context context, UUID crime_id){
Intent intent = new Intent(context,MainActivity.class);
intent.putExtra(EXTRA_CRIME_ID,crime_id);
return intent;
}
Fragment
UUID crimeId = (UUID) getActivity().getIntent().getSerializableExtra(MainActivity.EXTRA_CRIME_ID)
crime = CrimeLab.get(getActivity()).getCrime(crimeId);
第二种方法,附加argument给fragment,调用Fragmen.setArguments(Bundle)方法,而且必须在ftagment创建后,添加activity(托管fragment的activity)前完成。
也就是说,再创建MainFragment实例时,直接把传递的数据传递过去,直接在MainFragment里面调用获取数据,所有的业务逻辑都在MainFragment里面实现,实现了模块的独立性。
public static MainFragment newInstance(UUID crime_id) {
Bundle bundle = new Bundle();
bundle.putSerializable(ARG_CRIME_ID, crime_id);
MainFragment fragment = new MainFragment();
fragment.setArguments(bundle);
return fragment;
}
获取argument
先调用Fragment的getArguments()方法,再调用Bundle的限定类型getXxx()方法
UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
crime = CrimeLab.get(getActivity()).getCrime(crimeId);
其实为了更好的实现模块的独立性,都是在获取数据的Activity或Fragment中创建静态方法实现具体的业务逻辑,而设置数据的Activity或Fragment负责调用静态方法,把需要传递的数据放入参数中即可。