安卓基础学习_Intent和IntentFilter

来源:互联网 发布:反映数据稳定性的指标 编辑:程序博客网 时间:2024/05/21 22:35
一、Intent对象详解Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。Intent提供了一种通用的消息系统,它允许在你的应用程序与其他应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三种类型的核心组件:活动,服务,广播接收者。意图可以划分为显式意图和隐式意图,显式意图指定了要激活的组件是哪个;隐式意图没有明确指定组件名,android会在隐式意图设置中设置动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。二、Intent的属性及IntentFilter配置Intent属性(对象)的设置1.Action,也就是要执行的动作2.Data,也就是执行动作要操作的数据3.type(数据类型),显式指定Intent的数据类型(MIME)4.category(类别),被执行动作的附加信息5.component(组件),指定Intent的的目标组件的类名称6.extras(附加信息),是其它所有附加信息的集合7.Flag(旗标),Intent可以调用addFlag()方法来为Intent添加控制旗标一个Intent对象最多包含一个Action属性,可以包含多个Category属性.(没设数据参数的情况下)只要Intent中的Action和Category都出现在Intent-Filter中,就能与之匹配,否则匹配失败Data属性通常用于向Action属性提供操作的数据。Data属性接受一个Uri对象。Uri格式:scheme://host:port/pathData属性和Type属性会相互覆盖,后设置的属性会覆盖前设置的属性,如果希望既有Data属性又有Type属性,就调用Intent的setDataAndType()方法。// 同时设置Intent的Data、Type属性intent.setDataAndType(Uri.parse("lee://www.fkjava.org:8888/mypath"),"abc/xyz");/*****常用FlagFLAG_ACTIVITY_BROUGHT_TO_FRONT  这个标志一般不是由程序代码设置的,如在launchMode中设置singleTask模式时系统帮你设定。FLAG_ACTIVITY_CLEAR_TOP  如果设置,并且这个Activity已经在当前的Task中运行,因此,不再是重新启动一个这个Activity的实例,而是在这个Activity上方的所有Activity都将关闭,然后这个Intent会作为一个新的Intent投递到老的Activity(现在位于顶端)中。    这个启动模式还可以与FLAG_ACTIVITY_NEW_TASK结合起来使用:用于启动一个Task中的根Activity,它会把那个Task中任何运行的实例带入前台,然后清除它直到根Activity。这非常有用,例如,当从Notification Manager处启动一个Activity。FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET      如果设置,这将在Task的Activity stack中设置一个还原点,当Task恢复时,需要清理Activity。也就是说,下一次Task带着FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记进入前台时(典型的操作是用户在主画面重启它),这个Activity和它之上的都将关闭,以至于用户不能再返回到它们,但是可以回到之前的Activity。这在你的程序有分割点的时候很有用。例如,一个e-mail应用程序可能有一个操作是查看一个附件,需要启动图片浏览Activity来显示。这个Activity应该作为e-mail应用程序Task的一部分,因为这是用户在这个Task中触发的操作。然而,当用户离开这个Task,然后从主画面选择e-mail app,我们可能希望回到查看的会话中,但不是查看图片附件,因为这让人困惑。通过在启动图片浏览时设定这个标志,浏览及其它启动的Activity在下次用户返回到e-mail程序时都将全部清除。FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS      如果设置,新的Activity不会在最近启动的Activity的列表中保存。FLAG_ACTIVITY_FORWARD_RESULT       如果设置,并且这个Intent用于从一个存在的Activity启动一个新的Activity,那么,这个作为答复目标的Activity将会传到这个新的Activity中。这种方式下,新的Activity可以调用setResult(int),并且这个结果值将发送给那个作为答复目标的Activity。FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY       这个标志一般不由应用程序代码设置,如果这个Activity是从历史记录里启动的(常按HOME键),那么,系统会帮你设定。FLAG_ACTIVITY_MULTIPLE_TASK       不要使用这个标志,除非你自己实现了应用程序启动器。与FLAG_ACTIVITY_NEW_TASK结合起来使用,可以禁用把已存的Task送入前台的行为。当设置时,新的Task总是会启动来处理Intent,而不管这是是否已经有一个Task可以处理相同的事情。由于默认的系统不包含图形Task管理功能,因此,你不应该使用这个标志,除非你提供给用户一种方式可以返回到已经启动的Task。如果FLAG_ACTIVITY_NEW_TASK标志没有设置,这个标志被忽略。FLAG_ACTIVITY_NEW_TASK        如果设置,这个Activity会成为历史stack中一个新Task的开始。一个Task(从启动它的Activity到下一个Task中的Activity)定义了用户可以迁移的Activity原子组。Task可以移动到前台和后台;在某个特定Task中的所有Activity总是保持相同的次序。这个标志一般用于呈现“启动”类型的行为:它们提供用户一系列可以单独完成的事情,与启动它们的Activity完全无关。使用这个标志,如果正在启动的Activity的Task已经在运行的话,那么,新的Activity将不会启动;代替的,当前Task会简单的移入前台。参考FLAG_ACTIVITY_MULTIPLE_TASK标志,可以禁用这一行为。这个标志不能用于调用方对已经启动的Activity请求结果。FLAG_ACTIVITY_NO_ANIMATION      如果在Intent中设置,并传递给Context.startActivity()的话,这个标志将阻止系统进入下一个Activity时应用Acitivity迁移动画。这并不意味着动画将永不运行——如果另一个Activity在启动显示之前,没有指定这个标志,那么,动画将被应用。这个标志可以很好的用于执行一连串的操作,而动画被看作是更高一级的事件的驱动。FLAG_ACTIVITY_NO_HISTORY       如果设置,新的Activity将不再历史stack中保留。用户一离开它,这个Activity就关闭了。这也可以通过设置noHistory特性。FLAG_ACTIVITY_NO_USER_ACTION       如果设置,作为新启动的Activity进入前台时,这个标志将在Activity暂停之前阻止从最前方的Activity回调的onUserLeaveHint()。      典型的,一个Activity可以依赖这个回调指明显式的用户动作引起的Activity移出后台。这个回调在Activity的生命周期中标记一个合适的点,并关闭一些Notification。如果一个Activity通过非用户驱动的事件,如来电或闹钟,启动的,这个标志也应该传递给Context.startActivity,保证暂停的Activity不认为用户已经知晓其Notification。FLAG_ACTIVITY_PREVIOUS_IS_TOP        If set and this intent is being used to launch a new activity from an existing one, the current activity will not be counted as the top activity for deciding whether the new intent should be delivered to the top instead of starting a new one. The previous activity will be used as the top, with the assumption being that the current activity will finish itself immediately.FLAG_ACTIVITY_REORDER_TO_FRONT      如果在Intent中设置,并传递给Context.startActivity(),这个标志将引发已经运行的Activity移动到历史stack的顶端。例如,假设一个Task由四个Activity组成:A,B,C,D。如果D调用startActivity()来启动Activity B,那么,B会移动到历史stack的顶端,现在的次序变成A,C,D,B。如果FLAG_ACTIVITY_CLEAR_TOP标志也设置的话,那么这个标志将被忽略。FLAG_ACTIVITY_RESET_TASK_IF_NEEDED  If set, and this activity is either being started in a new task or bringing to the top an existing task, then it will be launched as the front door of the task. This will result in the application of any affinities needed to have that task in the proper state (either moving activities to or from it), or simply resetting that task to its initial state if needed.FLAG_ACTIVITY_SINGLE_TOP       如果设置,当这个Activity位于历史stack的顶端运行时,不再启动一个新的。******//****指定Intent属性调用系统Activity------>查看联系人// 创建IntentIntent intent = new Intent();//设置Intent的Action属性intent.setAction(Intent.ACTION_GET_CONTENT);//设置Intent的Type属性intent.setType("vnd.android.cursor.item/phone");// 启动Activity,并希望获取该Activity的结果startActivityForResult(intent, PICK_CONTACT);public void onActivityResult(int requestCode, int resultCode, Intent data){super.onActivityResult(requestCode, resultCode, data);switch (requestCode){case (PICK_CONTACT):if (resultCode == Activity.RESULT_OK){// 获取返回的数据Uri contactData = data.getData();CursorLoader cursorLoader = new CursorLoader(this, contactData, null, null, null, null);// 查询联系人信息Cursor cursor = cursorLoader.loadInBackground();// 如果查询到指定的联系人if (cursor.moveToFirst()){String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));// 获取联系人的名字String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));String phoneNumber = "此联系人暂未输入电话号码";//根据联系人查询该联系人的详细信息Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID+ " = " + contactId, null, null);if (phones.moveToFirst()){//取出电话号码phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));  }// 关闭游标phones.close();EditText show = (EditText) findViewById(R.id.show);//显示联系人的名称show.setText(name);EditText phone = (EditText) findViewById(R.id.phone);//显示联系人的电话号码phone.setText(phoneNumber);}// 关闭游标cursor.close();}break;}}------>返回系统Home桌面// 创建Intent对象Intent intent = new Intent();// 为Intent设置Action、Category属性intent.setAction(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);startActivity(intent);------>浏览指定页面// 创建IntentIntent intent = new Intent();String data = "http://www.baidu.com";// 根据指定字符串解析出Uri对象Uri uri = Uri.parse(data);// 为Intent设置Action属性intent.setAction(Intent.ACTION_VIEW);// 设置Data属性intent.setData(uri);startActivity(intent);------>编辑第一个联系人// 创建IntentIntent intent = new Intent();// 为Intent设置Action属性(动作为:编辑)intent.setAction(Intent.ACTION_EDIT);String data = "content://com.android.contacts/contacts/1";// 根据指定字符串解析出Uri对象Uri uri = Uri.parse(data);// 设置Data属性intent.setData(uri);startActivity(intent);------>拨打指定号码// 创建IntentIntent intent = new Intent();// 为Intent设置Action属性(动作为:拨号)intent.setAction(Intent.ACTION_DIAL);String data = "tel:13800138000";// 根据指定字符串解析出Uri对象Uri uri = Uri.parse(data);// 设置Data属性intent.setData(uri);startActivity(intent);/*******使用Intent创建Tab页面// 获取该Activity里面的TabHost组件TabHost tabHost = getTabHost();// 使用Intent添加第一个Tab页面tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("已接电话",getResources().getDrawable(R.drawable.ic_launcher)).setContent(new Intent(this, BeCalledActivity.class)));// 使用Intent添加第二个Tab页面tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("呼出电话").setContent(new Intent(this, CalledActivity.class)));// 使用Intent添加第三个Tab页面tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("未接电话").setContent(new Intent(this, NoCallActivity.class)));
原创粉丝点击