首页 > 移动平台 > 详细

Android Activity任务栈与数据传递Intent(进阶之路)

时间:2016-03-20 07:01:23      阅读:189      评论:0      收藏:0      [点我收藏+]

一、简介

  通过进阶之路,学习对多个Activity的操作,最终了解以下知识点:

  • 不通过向导,创建新的Activity及配套布局。
  • 从一个Activity启动另外一个Activity。即,请求操作系统创建一个新的Activity实例,并调用它的onCreate(Bundle)成员方法。
  • 在父Activity(启动方)与子Acitity(被启动方)间进行数据传递。

二、创建Activity子类与新布局

  • 创建新布局

  选择New-->Layout source file选项,再填相应的配置。

  • 创建Activity子类

  选择New-->Java Class选项,新建一个继承于android.app.Activity的子类。在新的Activity子类中,覆盖方法onCreate(),即可。

  • 为新建的Activity在ActivityManager中进行注册。

  在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,最简单的方法就是使用以下Activity方法:

1 public void startActivity(Intent intent)
2 {
3 
4 }

  从形式上,startActivity(...)方法是Activity类的成员方法,实际上并非是这样。Activity调用startActivity(...)方法,是通过startActivity(...)方法向OS发送消息。准确来说,是通过startActivity(...)在向OS的ActivityManager类发送消息,由ActivityManager类收到消息后,创建Activity实例,并且调用onCreate(Bundel)方法。如下图所示:

技术分享

 

四、Activity间传递数据

  Activity间传递数据是通过Intent实现的,是基于Intent的通信。Intent对象是component与OS进行通信的一个媒介,即通信数据载体。还有一些其它的component,比如:service、broadcast receiver以及content provider。

  1. 使用Intent作为媒介传递数据:

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);

 

  2.在新创建的activity中获取附加extra信息,即Intent实例对象,有两个方式获取,即简单直接方式和复杂灵活方式:

  • 简单直接方式,使用getActivity()方法,获取托管的Activity对象,从而获取Intent对象:
    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托管者。

  • 复杂灵活方式,使用fragment argument传递数据,每个fragment实例都可以有一个Bundle对象。该Bundle包含有键-值对(key-value),可以像附加extra到Activity的Intent中,一样使用Bundle对象。

  (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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!