Android Intent简介

Intent对象主要用来在Android程序的Activity,Service和BroadcastReceiver这3大组件之间传输数据,

而针对这3大组件,有独立的Intent传输机制,分别如下:1、Activity:通过将一个Intent对象传递给Context.startActivity()或Activity.startActivityForResult(),      启动一个活动或者使用一个已经存在的活动去做新的事情。2、Service:通过将一个Intent对象传递给Content.startService(),初始化一个Service或者传递一个新的指令给正在运行的Service;      类似的,通过将一个Intent对象传递给ContentBindService(),可以建立调用组件和目标服务之间的连接3、BroadcastReceiver:通过将一个Intent对象传递给任何广播方法      (如:Context.sendBroadcast(),Context.sendOrderedBroadcast(),Context.sendStickyBroadcast()等,可以传递到所有感兴趣的广播接收者)

注意:在每种传输机制下,Android程序会自动查找合适的Activity,Service或者BroadcastReceiver来响应Intent(意图),      如果有必要的话,初始化他们,这些消息系统之间没有重叠,即广播意图只会传递给广播接收者,而不会传递给活动或者服务,反之亦然。

Intent通过下面的属性来描述以上的某个意图:      action:用来表示意图的动作,如:查看、发邮件、打电话      category:用来表示动作的类别      data:用来表示与动作要操作的数据。如:查看 联系人      type:对data类型的描述      extras:附加信息,如:详细资料,一个文件,某事      component:目标组件(显示Intent)

显示Intent      指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context,Class)来指定)。      通过指定具体的组件类,通知应用启动对应的组件

隐式Intent      没有指定Component属性的Intent.这些Intent需要包含足够的信息,这样系统才能够根据这些信息,在所有的可用组件中,确定满足此Intent的组件。

对于显示的Intent,Android不需要去解析,因为目标组件已经很明确,Android需要解析的是那些隐式的Intent,通过解析,将Intent映射给可以处理此Intent的Activity、IntentReceiver或者Service

Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有Intent-filter及其定义的Intent,最终找到匹配的Intent。      1、如果Intent指明了action,则目标组件的Intent-Filter的action列表中就必须包含有这个action,否则不能匹配。      2、如果Intent没有提供type,系统将从data中得到数据类型,和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。      3、如果Intent的数据不是content:类型的URI,而且Intent也没有明确指定它的type,将根据Intent中的数据的scheme(比如http;或者mailto:)进行匹配。          同上,Intent的scheme必须出现在目标组件的scheme列表中。      4、如果Intent指定了一个或多个category,这些类别必须全部出现在组件的类别列表中。比如Intent中包含两个类别:LAUNCH_CATEGORY和ALTERNATIVE_CATEORY,          解析得到的目标组件必须至少包含这两个类别。

只有<action>和<category>中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能够响应该Intent

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent"
 3     android:layout_height="match_parent"
 4     android:orientation="vertical">
 5
 6     <Button
 7         android:layout_width="wrap_content"
 8         android:layout_height="wrap_content"
 9         android:onClick="toMain"
10         android:text="显示Intent   启动自己"
11         android:textAllCaps="false" />
12
13     <Button
14         android:layout_width="wrap_content"
15         android:layout_height="wrap_content"
16         android:onClick="setComponent"
17         android:text="启动别包下的activity"
18         android:textAllCaps="false" />
19
20     <Button
21         android:layout_width="wrap_content"
22         android:layout_height="wrap_content"
23         android:onClick="action"
24         android:text="ActionViewActivity响应此action"
25         android:textAllCaps="false" />
26
27     <Button
28         android:layout_width="wrap_content"
29         android:layout_height="wrap_content"
30         android:onClick="web"
31         android:text="浏览网页"
32         android:textAllCaps="false" />
33
34     <Button
35         android:layout_width="wrap_content"
36         android:layout_height="wrap_content"
37         android:onClick="call1"
38         android:text="系统拨号界面"
39         android:textAllCaps="false" />
40
41     <Button
42         android:layout_width="wrap_content"
43         android:layout_height="wrap_content"
44         android:onClick="call2"
45         android:text="拨号"
46         android:textAllCaps="false" />
47
48 </LinearLayout>

activity_main.xml

 1 public class MainActivity extends AppCompatActivity {
 2
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_main);
 7     }
 8
 9     public void toMain(View v) {
10         Intent intent = new Intent(this, MainActivity.class);
11         startActivity(intent);
12     }
13
14     public void setComponent(View v) {
15         //首先创建一个空参的Intent对象
16         Intent intent = new Intent();
17         //Component(包名,完整的类名)
18         ComponentName componentName = new ComponentName("com.example.lesson9_activitylaunchmode", "com.example.lesson9_activitylaunchmode.MainActivity");
19         //设置目标组件
20         intent.setComponent(componentName);
21         startActivity(intent);
22
23     }
24
25     public void action(View v) {
26         Intent intent = new Intent(Intent.ACTION_VIEW);
27         //这里可能找不到能够响应这个ACTION_VIEW的目标组件,会报ActivityNotFound异常。所以可以做try-catch
28         startActivity(intent);
29         //创建一个ActionViewActivity活动,并注册,指定能响应ACTION_VIEW
30     }
31
32     public void web(View v) {
33         Intent intent = new Intent(Intent.ACTION_VIEW);
34         intent.setData(Uri.parse("http://www.baidu.com"));
35         startActivity(intent);
36     }
37
38     //系统拨号界面,报错
39     public void call1(View v) {
40         Intent intent = new Intent(Intent.ACTION_DIAL);
41         intent.setClassName("com.android.contacts", "com.android.contacts.DialtactsActivity");
42         startActivity(intent);
43     }
44
45
46     //拨号界面
47     public void call2(View v) {
48         Uri uri = Uri.parse("tel:18822818871");
49         Intent intent = new Intent(Intent.ACTION_DIAL, uri);
50         startActivity(intent);
51     }
52 }

MainActivity.java

1 public class ActionViewActivity extends AppCompatActivity {
2     @Override
3     protected void onCreate(@Nullable Bundle savedInstanceState) {
4         super.onCreate(savedInstanceState);
5         TextView tv = new TextView(this);
6         tv.setText("这是这是ActionViewActivity");
7         setContentView(tv);
8     }
9 }

ActionViewActivity .java

 1 <application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
 2         android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
 3         <activity android:name=".MainActivity">
 4             <intent-filter>
 5                 <action android:name="android.intent.action.MAIN" />
 6
 7                 <category android:name="android.intent.category.LAUNCHER" />
 8             </intent-filter>
 9         </activity>
10         <activity android:name=".ActionViewActivity">
11             <intent-filter>
12                 <action android:name="android.intent.action.VIEW"/>
13                 <category android:name="android.intent.category.DEFAULT"/>
14             </intent-filter>
15
16         </activity>
17     </application>

AndroidManifest.xml

				
时间: 2024-10-05 04:58:18

Android Intent简介的相关文章

Android 中的 Intent 简介

Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据. -----------------------------------------------显示Intent------------------------------------------------ Intent有多个构造器函数的重载,其中一个是Intent( Context packageContent , Class<?>cls ) 第一个参数C

Intent系列讲解---Intent简介以及相关属性

一.Intent简介 Intent中文是"意图,意向",它是Android中四大组件通讯的纽带,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用.Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互.因此,可以将Intent理解为不同组件之间通信的"媒介"专门提供组件互相调用的相关信息

【译】Android系统简介—— Activity

续上一篇,继续介绍Android系统.上一篇: [译]Android系统简介 本文主要介绍构建Android应用的一些主要概念: Activity Activity是应用程序中一个单独的有UI的页面(screen),例如:在email应用中,会有一个activity用来显示email的列表,还有activity用来显示具体的email.通常来说,只要有用户交互的应用,就会包含至少一个activity. 一个应用可以包含多个activity,每个activity之间可通过intent进行交互,关于

Android插件简介

/** * @actor Stafen.D * @time 2015.02.06 * @blog http://www.cnblogs.com/stafen */ Android插件简介 Android下,默认的情况是,每个apk相互独立的,基本上每个应用都是一个dalvik虚拟机,都有一个uid,再配合上linux本身的权限机制,使得apk互通很难直接进行.但作为一个独立应用的集成,不管多少个apk,都可以并为一个单独的dalvik虚拟机,直观的反映给开发人员就是在shell下列出进程,那几个

Android精通教程-第一节Android入门简介

前言 大家好,给大家带来Android精通教程-第一节Android入门简介的概述,希望你们喜欢 每日一句 If life were predictable it would cease to be life, and be without flavor. --- Eleanor Roosevelt 入门工具的安装 第一步:要下载的朋友注意了,先看完教程了解个大概,下载Android studio前,先安装jdk和IDE,Android SDK 第二步:下载jdk,提供JDK 9 地址: htt

android之android.intent.category.DEFAULT的用途和使用

转载(http://blog.csdn.net/jason0539/article/details/10049899) 1.要弄清楚这个问题,首先需要弄明白什么是implicit(隐藏) intent什么是explicit(明确) intent. Explicit Intent明确的指定了要启动的Acitivity ,比如以下Java代码: Intent intent= new Intent(this, B.class): Implicit Intent没有明确的指定要启动哪个Activity

Android Intent 意图作用

Intent分为两大类: (1)显性的(Explicit) (2)隐性的(Implicit) 对于隐性意图,在某些时候, 应用程序只是想启动具有某种特征的组件, 并不想和某个特定的组件耦合. 使用Intent可以方便的达到这种高层次解耦的目的.(在模块间的组件启动) intent定位事件的目的地: (1)种类(category),比如我们常见的 LAUNCHER_CATEGORY 就是表示这是一类应用程序. (2)类型(type),在前面的例子中没用过,表示数据的类型,这是隐性Intent定位目

转android intent action 介绍大全

一些常用的Intent: Uri Action 功能 备注 geo:latitude,longitude Intent.ACTION_VIEW 打开地图应用程序并显示指定的经纬度   geo:0,0?q=street+address Intent.ACTION_VIEW 打开地图应用程序并显示指定的地址   http://web_address Intent.ACTION_VIEW 打开浏览器程序并显示指定的URL   https://web_address Intent.ACTION_VIEW

android细节之android.intent.category.DEFAULT的使用

我们知道,实现android的Activity之间相互跳转需要用到Intent, Intent又分为显式Intent和隐式Intent, 显式Intent很简单,比如我在FirstActivity中想跳转到SecondActivity,只需要直接声明就行了: Intent intent = new Intent(FirstActivity.this, SecondActivity.class); 而在使用隐式Intent实现Activity之间跳转的时候,并没有明确指定要打开哪个activity