Intents and Intent Filters(一)

2023-10-24 04:38
文章标签 intent filters intents

本文主要是介绍Intents and Intent Filters(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里你将会学到:

  1. 什么是Intent和Intent Filter
  2. Intent和Intent Filter有什么用
  3. 怎么启动(传递)一个Intent
  4. Intent里包含什么
  5. 什么是显式Intent以及什么隐式Intent
  6. Intent是怎样匹配的

一:前言

     在正式介绍Intent之前,我们先看下上面说的Activity、Service和Broadcast Receiver是怎样传递Intent。对于这三个组件而言,他们都有自己独立的传递Intent的机制:

  1. Activity:对于Activity来说,它主要是通过Context.startActivity() 或Activity.startActivityForRestult() 来启动一个存在的Activity做一些事情。当使用Activity.startActivityForResult() 启动一个Activity时,可以使用Activity.setResult()返回一些结果信息,可以在Activity.onActivityResult() 中得到返回的结果.
  2. Service:对于Service来说,它主要是通过Context.startService() 初始化一个Service或者传递消息给正在运行的Service。同样,也可以通过Context.bindService() 建立一个调用组件和目标服务之间的连接。
  3. Broadcast Receiver:我们可以通过 Context.sendBroadcast() , Context.sendOrderedBroadcast() 以及Context.sendStickyBroadcast() 这些方法,传递Intent给感兴趣的广播。

     消息之间的传递是没有重叠的,比如调用startActivity()传播一个Intent,只会传播给Activity,而不会传播给Service和Broadcast Receiver,反过来也是这样的。

二:Intent对象

      一个Intent对象包含了很多数据的信息,比如要执行的动作,类别,数据,附加信息等等,下面就一一列列出一个Intent中包含的信息。

组件名称

      这个组件名称字段其实就是一个ComponentName类,它包含了一个目标组件的全限定名,比如com.flysnow.intent.Activity1,这就是一个全限定名的Activity。组件名字可以通过setComponent()、setClass()或者setClassName()设置,如果设置了Intent目标组件的名字,那么这个Intent就会被传递给特定的组件,也就是我们说的显式Intent.如果不设置,则是隐式的Intent,Android系统将根据Intent Filter中的信息进行匹配.

Action(动作)

       一个Intent的Action在很大程度上说明这个Intent要做什么,是查看(View)、删除(Delete)、编辑(Edit)等等。Action一个字符串命名的动作,Android中预定义了很多Action,可以参考Intent类查看,下面是文档中的几个动作



     当然,我们也可以自定义Action,比如com.flysnow.intent.ACTION_ADD,定义Action的时候最好能表明意思,要做什么,这样我们的Intent中的数据才好填充。Intent对象的getAction()可以获取动作,使用setAction()可以设置动作。

Data(数据)

      Data,其实就是一个URI,用于执行一个Action时所用到的数据的URI和MIME。不同的Action有不同的数据规格,比如ACTION_EDIT动作,数据就可以能包含一个用于编辑文档的URI,如果是一个ACTION_CALL动作,那么数据就是一个包含了tel:6546541的数据字段,所以上面提到的自定义Action时要规范命名。数据的URI和类型对于Intent的匹配是很重要的,Android往往根据数据的URI和MIME找到能处理该Intent的最佳目标组件。

Category(类别)

     Category指定了用于处理Intent的组件的类型信息,一个Intent可以添加多个Category,使用addCategory()方法即可,使用removeCategory()删除一个已经添加的类别。Android的Intent类里定义了很多常用的类别,可以参考使用。

Extras(附加信息)

      有些用于处理Intent的目标组件需要一些额外的信息,那么就可以通过Intent的put..()方法把额外的信息塞入到Intent对象中,用于目标组件的使用,一个附件信息就是一个key-value的键值对..Intent有一系列的put和get方法用于处理附加信息的塞入和取出。

Flag(标识)

     Android有很多标识,用于标记如何启动一个活动,是NEW_TASK还是其他等等,以及启动后怎么对待这个活动。。可以参考Intent类中的FLAG常量字段。

三:Intent的解析

     介绍完了Intent对象的构成,就要介绍Android系统是怎样解析Intent的,Android是怎么传递Intent到目标组件的呢?

Intent分类

      Intent可以分为两类,一类是显式的Intent,一类是隐式的Intent,上面有过提及。显示的Intent就是指定了组件名字的,隐式的就是没有指定Intent的组件名字,需要Android根据Intent中的Action、data、Category等来解析匹配。而目标组件(Activity、Service、Broadcast Receiver)怎通过设置他们的Intent Filter来界定其处理的Intent。如果一个组件没有定义Intent Filter,那么它只能接受处理显示的Intent,只有定义了Intent Filter的组件才能同时处理隐式和显示的Intent。

Action检测

     为了对Action的作用进行检测,我们使用一个例子来演示Action的作用。项目名为Intents,应用名为Intents and Filters,运行在Android2.2版本上.主启动Activity为IntentsTestList

  1. IntentsTestList代码如下:
/*** Intents测试列表类* @author 飞雪无情* @since 2011-3-14*/
public class IntentsTestList extends ListActivity {private String ACTION_VIEW="com.flysnow.intent.ACTION_VIEW";/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//定义ListAdaptersetListAdapter(new SimpleAdapter(this, getData(),android.R.layout.simple_list_item_1, new String[] { "title" },new int[] {android.R.id.text1}));getListView().setTextFilterEnabled(true);//注册一个广播super.registerReceiver(new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "该Broadcast的Intent Filter值只设置了Action", Toast.LENGTH_SHORT).show();}},new IntentFilter(ACTION_VIEW));}@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {Intent intent=(Intent)getData().get(position).get("intent");Boolean isActivity=(Boolean)getData().get(position).get("isActivity");if(isActivity){startActivity(intent);}else{sendBroadcast(intent);}}/*** 返回ListView需要的数据* @return ListView需要的数据*/private List<Map<String,Object>> getData() {List<Map<String,Object>> data=new ArrayList<Map<String,Object>>();addItem(data, "空Action的Activity", new Intent(),true);addItem(data, "Action检测-Activity", new Intent(ACTION_VIEW),true);addItem(data, "Action检测-Broadcast", new Intent(ACTION_VIEW),false);return data;}/*** 给ListView添加数据* @param data 存储数据的List* @param name 要显示的Title* @param intent 单击某一项时要启动的Activity* @param isActivity 启动的是否是Activity,true是,false为广播*/private void addItem(List<Map<String,Object>> data, String name, Intent intent,boolean isActivity) {Map<String, Object> temp = new HashMap<String, Object>();temp.put("title", name);temp.put("intent", intent);temp.put("isActivity", isActivity);data.add(temp);}
}

  1.  这里主要是使用ListActivity列出3个测试,一个测试空的Intent,一个测试只有Action的Intent--Activity版,一个测试只有Action的Intent--Broadcast版。。。
  2. 为了测试startActivity(),我们新建一个Activity名字为ActionActivity代码如下:
/*** @author 飞雪无情* @since 2011-3-14*/
public class ActionActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView text=new TextView(this);text.setText("该Activity的Intent Filter值只设置了Action");setContentView(text);}}

  1.  很简单,只有一段文本的展示。
  2. AndroidManifest.xml修改如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.flysnow.intent"android:versionCode="1"android:versionName="1.0"><uses-sdk android:minSdkVersion="8" /><application android:icon="@drawable/icon" android:label="@string/app_name"><activity android:name=".IntentsTestList"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".ActionActivity" android:label="Action检测"><intent-filter><action android:name="com.flysnow.intent.ACTION_VIEW"></action><action android:name="android.intent.action.VIEW"></action><category android:name="android.intent.category.DEFAULT"></category></intent-filter></activity></application>
</manifest>

  1. 很简单,为我们的ActionContext加上了两个action标签和一个category标签,加category标签设置成android.intent.category.DEFAULT是为了让这个Activity可以接收隐式的Intent请求,这是Android规定的,对于Activity,使用Context.startActivity()传递隐式Intent,默认是包含了android.intent.category.DEFAULT的,所以定义的Activity要想接收,必须在Intent Filter里添加android.intent.category.DEFAULT这个Category。
  2. 运行入下图:

     当点击“空Action的Activity”的时候,会报异常,因为Intent什么都没有设置,没有任何的Activity能处理它 。当点击“Action检测-Activity”的时候会打开我们的ActionActivity这个Activity,点击“Action检测-Broadcast”会弹出Toast提示,说明已经被接收到。。从上面我们可以看出,当Intent设置了Action时,只要对应的组件的Intent Filter中包含该Action的定义,那么这个组件就会接收该Intent。。。 



转载地址:http://flysnow.iteye.com/blog/961576

这篇关于Intents and Intent Filters(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/272753

相关文章

兔子--PendingIntent与Intent的区别

pendingIntent是一种特殊的Intent。 主要的区别在于Intent的执行立刻的,而pendingIntent的执行不是立刻的。 pendingIntent执行的操作实质上是参数传进来的Intent的操作, 但是使用pendingIntent的目的在于它所包含的Intent的操作的执行是需要满足某些条件的。 主要的使用的地方和例子:通知Notificatio

Android使用Intent传递对象

文章目录 Android使用Intent传递对象Serializable方式Parcelable方式 Android使用Intent传递对象 Intent的用法相信你已经比较熟悉了,我们可以借助它来启动活动、发送广播、启动服务等。在进行上述操作的时候,我们还可以在Intent中添加一些附加数据,以达到传值的效果,比如在FirstActivity中添加如下代码: Intent

MQTT: Topic Names and Topic Filters

Topic Names and Topic Filters Topic wildcards Topic Name 和 Topic Filter 的区别就是 Topic Name 不能包含通配符,而 Topic Filter 可以包含通配符。 Topic Name 标识一个具体的主题,而 Topic Filter 可以标识一个或者一组主题。 Topic level separator

android-Intent,Injector,Template,Adapter,Validation,Gesture,Game,Game Engine,Bluetooth...

Intent Intent PhotoPicker 图片选择 & 图片预览https://github.com/donglua/PhotoPicker Injector AndroidAnnotations Fast Android Development. Easy maintainance. https://github.com/excilys/androidannotations

遇到“Interpreter parsed an intent ‘xxx‘ which is not defined in the domain“报错

运行rasa shell的时候遇到如图报错: 从字面意思来看是这个”show_tasks”的intent没有在domain中定义。但是我打开domain.yml检查,domain里面是包含了这个intent的。那又是怎么回事呢? 遇到这个报错,不仅仅要检查domain.yml,还要查看nlu.md这个文件,要比对两个文件中intent的命名是否一致?若命名不一致,则会在rasa shell

【Android应用开发】Intent和PendingIntent的区别

intent英文意思是意图,pending表示即将发生或来临的事情。 PendingIntent这个类用于处理即将发生的事情。比如在通知Notification中用于跳转页面,但不是马上跳转。 Intent 是及时启动,intent 随所在的activity 消失而消失。 PendingIntent 可以看作是对intent的包装,通常通过getActivity,getBroadcast

语音信号处理2:数字滤波器 Digital Filters

参考: The Scientist and Engineer’s Guide to Digital Signal Processing Multimedia Signal Processing: Theory and Applications in Speech, Music and Communications Classification 欲知细节,先识大体,看看数字滤波器都有哪些种类吧

Android中的Intent Filter匹配规则介绍

本文主要介绍了隐式Intent匹配目标组件的规则,若有叙述不清晰或是不准确的地方希望大家指出,谢谢大家:  ) 1. Intent简介 Intent用于在一个组件(Component,如Activity、Service、Broadcast Receiver)中打开另一个组件。 Intent可分为隐式(implicitly)和显式(explicitly)两种: Explicitly

iOS App快捷指令(App Intents)在系统搜索服务中注册shortcuts

iOS App快捷指令(App Intents)在系统搜索服务中注册shortcuts 前言效果图实现快捷指令1. 定义AppIntent2. 定义`AppShortcutsProvider使用 参考资料 前言 网上很多资料都是关于IntentsExtension的,但是IntentsExtension只能实现快捷指令的添加,无法在系统搜索服务中搜索到。 这时候就得用到App I

怎么解析PendingIntent,从而得到其中描述的Intent

PendingIntent是一种特殊的Intent,它可以在稍后的某个时间点或者某个特定的事件发生时被触发。它可以用来启动一个Activity,发送一个Broadcast或者启动一个Service。 要解析PendingIntent,首先需要获取它的Intent对象,可以使用PendingIntent的getIntent()方法来获取。然后,可以使用Intent的getAction()、ge