移动设备软件开发第8章Android核心组件之Activity本节课主要内容Activity之间的跳转及数据传递Activity的生命周期Activity的启动模式Activity之间的跳转及数据传递Intent简介在一个Activity中启动另一个Activity的方法使用Intent在Activity之间传递数据多个Activity多个Activity之间的关系Activity01Activity02startActivity(Intentintent)startActivityForResult(Intentintent,intrequestCode)Intent简介Intent是一个动作的完整描述,包含了动作的产生组件、接收组件和传递的数据信息。Intent可称为一个在不同组件之间传递的消息,这个消息在到达接收组件后,接收组件会执行相关的动作;允许应用程序与其它的应用程序间传递Intent来执行动作和产生事件。Activity之间消息的传递;Intent是Activity、Service、BroadcastReceiver之间的桥梁,为Activity、Service和BroadcastReceiver等组件提供交互能力Intent简介IntentactivityserviceBroadcastreceiverIntent的用途绑定应用程序组件,并在应用程序之间进行通信;一般用于启动Activity,启动服务,发送广播等,承担了Android应用程序三个核心组件相互间的通信功能。Intent简介Intent简介一个Intent对象是一个信息包,包含了要接收此Intent的组件需要的信息(例如需要的动作和动作需要的信息),Android系统需要的信息。一个Intent对象包含一组信息:Componentname:要处理这个Intent对象的组件名Action:Intent要完成的动作Data:执行动作的URI和MIME类型,不同的动作有不同的数据规格。Category:类别,为执行动作的附加信息,提供了额外的信息,有关于能够处理这个Intent对象的组件种类。Extras:附加信息Flags:很多是用来指定Android系统如何启动activity,还有启动了activity后如何对待它。如果我们在启动一个Activity时使用这样的Intent对象:Intentintent=newIntent();intent.setAction(com.ultrawise.myaction);那么所有的Action列表中包含了“com.ultrawise.myaction”的Activity都将会匹配成功。启动Activity显式启动:必须在Intent中指明启动的Activity所在的类;隐式启动:Android系统根据隐式意图中设置的动作(Action)、类别(category)、数据(Uri和数据类型)决定启动哪一个组件。也就是说在隐式启动时,Intent中只包含需要执行的动作和所包含的数据,而无需指明具体启动哪一个Activity,选择权有Android系统和最终用户来决定。创建一个Intent对象指定当前的应用程序上下文以及要启动的Activity把创建好的这个Intent作为参数传递给startActivity()方法使用Intent显式启动Activity显式启动Activity方法一:采用Intent有参构造函数Intent(ContextpackageContext,Class?cls)第1个参数是应用程序上下文;第2个参数是接收Intent的目标组件,直接指明了需要启动的ActivityIntentintent=newIntent(MainActivity.this,SecondActivity.class);startActivity(intent);publicclassSecondActivityextendsActivity{protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.second);}}publicclassMainActivityextendsActivity{privateButtonbtn=null;publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);btn=(Button)findViewById(R.id.call);btn.setOnClickListener(listener);}privateOnClickListenerlistener=newOnClickListener(){publicvoidonClick(Viewv){Intentintent=newIntent(MainActivity.this,SecondActivity.class);startActivity(intent);//启动intent}};}显式启动Activity显式启动Activity方法二:采用Intent无参构造函数构造一个空Intent对象。然后采用该对象的setClass()方法setClass(ContextpackageContext,Class?cls)Intentintent=newIntent();intent.setClass(MainActivity.this,SecondActivity.class);publicclassSecondActivityextendsActivity{protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.second);}}publicclassMainActivityextendsActivity{privateButtonbtn=null;publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);btn=(Button)findViewById(R.id.call);btn.setOnClickListener(listener);}privateOnClickListenerlistener=newOnClickListener(){publicvoidonClick(Viewv){Intentintent=newIntent();intent.setClass(MainActivity.this,SecondActivity.class);startActivity(intent);//启动intent}};}显式启动Activity使用Intent隐式启动Activity优点:不需要指明需要启动哪一个Activity,而由Android系统来决定,有利于使用第三方组件。隐式启动Activity时,Android系统在应用程序运行时解析Intent,并根据一定的规则对Intent和Activity进行匹配,使Intent上的动作、数据与Activity完全吻合。隐式启动Activity在AndroidManifest.xml文件里action标签指明了当前Activity可以响应的动作为“cn.itscast.xxx”,而category标签则包含了一些类别信息,只有当action、category中的内容同时匹配时,Activity才会被启动。隐式启动的代码如下:Activity中在缺省情况下,Android系统会调用内置的Web浏览器Intent的语法如下Intent构造函数的第1个参数是Intent需要执行的动作第2个参数是URI,表示需要传递的数据Intentintent=newIntent(Intent.ACTION_VIEW,Uri.parse(urlString));隐式启动ActivityIntent的动作是Intent.ACTION_VIEW,根据URI的数据类型来匹配动作数据部分的URI是Web地址,使用Uri.parse(urlString)方法,可以简单的把一个字符串解释成Uri对象.对以Uri方式传送的数据,根据Uri协议部分以最佳方式启动相应的Activity进行处理。对于http:address将打开浏览器查看;对于tel:address将打开拨号呼叫指定的电话号码1.Intentintent=newIntent(Intent.ACTION_VIEW,Uri.parse());2.startActivity(intent);隐式启动ActivityAndroid系统支持的常见动作字符串常量表动作说明ACTION_ANSWER打开接听电话的Activity,默认为Android内置的拨号盘界面ACTION_CALL打开拨号盘界面并拨打电话,使用Uri中的数字部分作为电话号码ACTION_DELETE打开一个Activity,对所提供的数据进行删除操作ACTION_DIAL打开内置拨号盘界面,显示Uri中提供的电话号码ACTION_EDIT打开一个Activity,对所提供的数据进行编辑操作ACTION_INSERT打开一个Activity,在提供数据的当前位置插入新项ACTION_PICK启动一个子Activity,从提供的数据列表中选取一项ACTION_SEARCH启动一个Activity,执行搜索动作ACTION_SENDTO启动一个Activity,向数据提供的联系人发送信息ACTION_SEND启动一个可以发送数据的ActivityACTION_VIEW最常用的动作,对以Uri方式传送的数据,根据Uri协议部分以最佳方式启动相应的Activity进行处理。对于http:address将打开浏览器查看;对于tel:address将打开拨号呼叫指定的电话号码ACTION_WEB_SEARCH打开一个Activity,对提供的数据进行Web搜索隐式启动Activity以下代码说明如何隐式启动Activity1.publicclassWebViewIntentDemoextendsActivity{2.publicvoidonCreate(BundlesavedInstanceState){3.super.onCreate(savedInstanceState);4.setContentView(R.layout.main);5.finalEditTexteditText=(EditText)findViewById(R.id.edit_url);6.finalButtonbutton=(Button)findViewById(R.id.btn);7.button.setOnClickListener(newOnClickListener(){8.publicvoidonClick(Viewview){9.StringurlString=editText.getText().toString();10.Intentintent=newIntent(Intent.ACTION_VIEW,Uri.parse(urlString));11.startActivity(intent);12.}13.});14.}15.}隐式启动Activity使用Intent在Activity之间传递数据当一个Activity启动另一个Activity时,常常会有