通过进阶之路,学习对多个Activity的操作,最终了解以下知识点:
选择New-->Layout source file选项,再填相应的配置。
选择New-->Java Class选项,新建一个继承于android.app.Activity的子类。在新的Activity子类中,覆盖方法onCreate(),即可。
在AndroidManifest.xml文件中,添加新建的Activity,进入注册。
<activity android:name=".MainActivity"> <intent-filter> <!-- 设置当前Activity为应用的第一个Activity --> <action android:name="android.intent.action.MAIN"/> <!-- 此应用程序是否显示在系统的程序列表中(此配置仅需在第一个Activity中配置) --> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>
一个Activity启动另一个Activity,最简单的方法就是使用以下Activity方法:
1 public void startActivity(Intent intent) 2 { 3 4 }
从形式上,startActivity(...)方法是Activity类的成员方法,实际上并非是这样。Activity调用startActivity(...)方法,是通过startActivity(...)方法向OS发送消息。准确来说,是通过startActivity(...)在向OS的ActivityManager类发送消息,由ActivityManager类收到消息后,创建Activity实例,并且调用onCreate(Bundel)方法。如下图所示:
Activity间传递数据是通过Intent实现的,是基于Intent的通信。Intent对象是component与OS进行通信的一个媒介,即通信数据载体。还有一些其它的component,比如:service、broadcast receiver以及content provider。
1 // 创建intent媒介,第一个参数为当前activity实例,第二个参数为将要创建的activity类信息 2 Intent i = new Intent(getActivity(), CrimeActivity.class); 3 // 附加extra信息 4 i.putExtra(CrimeFragment.sExtra_Crime_ID, c.getmId()); 5 // 通过os,activityManager启动activity 6 startActivity(i);
1 // 附加extra信息,在创建activity对象时初始化,通过getIntent()方法获取Intent对象 2 UUID crimeId = (UUID)getActivity().getIntent().getSerializableExtra(sExtra_Crime_ID); 3 // 单例数据对象中,获取指定数据 4 mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
PS:此种方式简单直接,但缺点是使用fragment不再是可复用的,因它需要某个具体的Activity托管者。
(1). 附加extra信息argument给Fragment,要创建Fragment argument,首先需创建Bundle对象,然后,使用Bundle限定类型的“put”方法(类似于Intent的方法),将argument添加到Bundle对象中。如下所示:
1 // 创建Bundle对象 2 Bundle args = New Bundle(); 3 // 附加extra数据,以键-值对形式 4 // put一个boolean类型值 5 args.putSerializable(EXTRA_MY_OBJECT, myObject); 6 // put一个int类型值 7 args.putInt(EXTRA_MY_INT, myInt); 8 // put一个字符串类型值 9 args.putCharSequence(EXTRA_MY_STRING, myString);
(2). 获取Fragment的argument,只需要通过Fragment类的getArgument()方法,即可:
1 UUID crimeId = (UUID)getArguments().getSerializable(sExtra_Crime_ID);
Demo:
获取Intent对象数据,赋给Fragment对象的argument:
1 public class CrimeActivity extends SingleFragmentActivity 2 { 3 @Override 4 public Fragment createFragment() 5 { 6 UUID crimeId = (UUID)getIntent().getSerializableExtra(CrimeFragment.sExtra_Crime_ID); 7 return CrimeFragment.newInstance(crimeId); 8 } 9 }
获取Fragment的argument:
1 public class CrimeFragment extends Fragment 2 { 3 private Crime mCrime; 4 // extra key 5 public static final String sExtra_Crime_ID = "crimeId"; 6 7 public static CrimeFragment newInstance(UUID crimeId) 8 { 9 Bundle args = new Bundle(); 10 args.putSerializable(sExtra_Crime_ID, crimeId); 11 CrimeFragment fragment = new CrimeFragment(); 12 fragment.setArguments(args); 13 return fragment; 14 } 15 16 @Override 17 public void onCreate(Bundle savedInstanceState) 18 { 19 super.onCreate(savedInstanceState); 20 // 附加extra信息,在创建activity对象时初始化,通过getIntent()方法获取Intent对象 21 // UUID crimeId = (UUID)getActivity().getIntent().getSerializableExtra(sExtra_Crime_ID); 22 // 单例数据对象中,获取指定数据 23 UUID crimeId = (UUID)getArguments().getSerializable(sExtra_Crime_ID); 24 mCrime = CrimeLab.get(getActivity()).getCrime(crimeId); 25 } 26 }
(未完待续...)
Android Activity任务栈与数据传递Intent(进阶之路)
原文:http://www.cnblogs.com/naray/p/5281783.html