区块链技术博客
www.b2bchain.cn

Android Intent:Android系统的通信桥梁

这篇文章主要介绍了Android Intent:Android系统的通信桥梁的讲解,通过具体代码实例进行19924 讲解,并且分析了Android Intent:Android系统的通信桥梁的详细步骤与相关技巧,需要的朋友可以参考下https://www.b2bchain.cn/?p=19924

本文实例讲述了2、树莓派设置连接WiFi,开启VNC等等的讲解。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/7039.html。具体如下:

Android Intent:Android系统的通信桥梁

  • Intent
    • 定义及作用
    • 种类
      • 显式intent
      • 隐式Intent
    • 属性
      • (1)Component(组件信息)
      • (2)Action(动作)
      • (3)Category(类别)
      • (4)Data(数据)
      • (5)Type(数据类型)
      • (6)Extra(附加信息)
      • (7)flag(标记)
    • 传值
      • (1)向下一个活动传值
      • (2)向上一个活动传值
      • 参考资料

Intent

定义及作用

Intent:意图。它是Android程序中各组件之间进行交互的一种重要方式,它不仅可以启动新组件调用别的应用程序、还可以在不同组件及应用程序之间传递数据
一个Intent对象就是对一次将要执行操作的抽象描述。Intent代表了Android应用的启动意图,Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,则取决于Intent的各属性,我们稍后将会进行详细介绍。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
我们以一段比喻来理解,比如我们平常的点外卖,把外卖看成一个个的Intent,把外卖员看成Android系统,他会根据每个外卖上面信息(地址、电话)的不同描述,向每个个人传递相关信息,把外卖送到每个人的手上,完成外卖配送这样子。Intent也是一样,携带着一定的信息,通过Android应用去判断信息进而启动新组件或应用程序、传送数据到新的组件或应用程序中。
Intent一般可被用于启动活动启动服务发送广播以及携带数据到其他组件中等场景。本节课我们将以启动活动传递数据为主向大家讲述Intent各种神奇的作用。

种类

显式intent

通过提供目标应用的软件包名称或完全限定的组件类名来指定可处理 Intent 的应用。它一般用在源组件已知目标组件名称的前提下,这种方式一般在应用程序内部实现。比如在某应用程序内,一个 Activity 启动一个 Service或一个Activity启动另一个Activity等。
我们先来试一下显式Intent如何使用。
新建IntentTest项目–>新建second_activity.xml以及SecondActivity.java
在activity_main.xml文件下添加一个Button控件如下:
Android Intent:Android系统的通信桥梁

<Button         android:id="@+id/button_1"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:text="显式启动一个新的Activity"         android:layout_marginTop="20dp"         android:layout_marginLeft="20dp"         android:layout_marginRight="20dp"         android:onClick="buttonOne"         /> 

在MainActivity中添加点击按钮的的方法:

 public void buttonOne(View view){         Intent intent = new Intent(MainActivity.this,SecondActivity.class);         startActivity(intent);     } 

并在Button控件中添加OnClick属性设置回调方法:

android:onClick="buttonOne" 

因为神奇的Intent,我们通过点击按钮就可以成功的启动一个新的活动啦。
这个时候如果你想回到上一个活动怎么办呢,按下Back键就可以回到上一个活动了。
由于使用这种方法来启动活动,Intent的“意图”非常明显,因此我们称之为显式Intent

隐式Intent

隐式Intent就比较含蓄了,它不会指定特定的组件,也就是不会明确指出要我们启动哪一个活动,而是指定一系列action和category等信息,让系统去分析这个Intent并帮我们找出合适的活动去启动。
使用隐式 Intent 时,Android 系统通过将 Intent 的内容与在设备上所有应用(包括自身应用)的清单文件中声明的 Intent 过滤器进行比较,从而找到要启动的相应组件。如果 Intent 与 Intent 过滤器匹配,则系统将启动该组件,并向其传递 Intent 对象。如果多个 Intent 过滤器兼容,则系统会显示一个对话框,用户自行选取要使用的应用。
现在我们来试试通过隐式Intent启动一个活动。
再在activity_main.xml文件下添加另一个Button控件如下:
Android Intent:Android系统的通信桥梁
再新建一个新建third_activity.xml以及ThirdActivity.java文件,并在Android Manifest.xml中注册ThirdActivity,并声明本活动的Intent-Filter

 intent-filter(Intent过滤器):一个隐式 Intent 请求要能够传递到目标组件,必须要通过 Action、Data 以及 Category 三个属性的检查。  就是说Action、Data 以及 Category是通行证, 如果他们的任何一个值不符合,该隐式Intent将不会被传递给目标组件。 
<activity android:name=".ThirdActivity">             <intent-filter>                 <action android:name="android.intent.action.VIEW"/>                 <category android:name="android.intent.category.DEFAULT"/>             </intent-filter>         </activity> 

然后到MainActivity添加点击按钮的的方法:

  public void buttonTwo(View view){         Intent intent = new Intent(Intent.ACTION_VIEW);         intent.addCategory("android.intent.category.DEFAULT");         startActivity(intent);     } 

同理,在Button控件中添加OnClick属性设置回调方法

android:onClick="buttonTwo" 

现在点击按钮,你同样成功启动一个新的活动,但不同的是你这次使用了隐式Intent的方式来启动。这就说明我们在Android Manifest.xml下配置的action以及category内容生效啦!

属性

Intent中包含的属性主要有:Component(目标组件),Action(动作),Category(类别), Data(数据),Type(数据类型),Extra(附加信息),Flag(标记)这7个属性。

(1)Component(组件信息)

Intent 的 Compotent 属性指定 Intent 的目标组件的类名称。使用如下:

Intent intent = new Intent(context, OtherActivity.class); 

Context是上下文也就是当前的activity,后面的xxx.class则是我们通过intent要启动的新活动,参考我们上面使用显式intent启动活动的例子。

(2)Action(动作)

代表Intent要完成的一个抽象“动作”,比如发信息的权限,而具体要由哪个组件完成,Intent并不负责!它仅仅知道有这个Action,谁来完成就要通过Intent-filter筛选。
Intent中的Action必须能够和Android Manifest.xml中对应组件的Intent-filter的Action匹配(这里的匹配是完全相等)。 Android Manifest.xml中对应组件的Intent-filter中可以有多个action,但是只要Intent中的action能够和Android Manifest.xml中对应组件的Intent-filter中的任何一个action相同即可匹配成功。参考上面隐式Intent调用的例子。
常用的Action

动作名称 动作功能
ACTION_M AIN 作为一个主要的进入口,而并不期望去接受数据
ACTION_VIEW 向用户去显示数据
ACTION_ATTACH_DATA 别用于指定一些数据应该附属于一些其他的地方,例如,图片数据应该附属于联系人
ACTION_EDIT 访问已给的数据,提供明确的可编辑
ACTION_PICK 从数据中选择一个子项目,并返回你所选中的项目
ACTION_CHOOSER 显示一个 activity 选择器,允许用户在进程之前选择他们想要的
ACTION_GET_CONTENT 允许用户选择特殊种类的数据,并返回(特殊种类的数据:照一张相片或录一段音)
ACTION_DIAL 拨打一个指定的号码,显示一个带有号码的用户界面,允许用户去启动呼叫
ACTION_CALL 根据指定的数据执行一次呼叫(ACTION_CALL 在应用中启动一次呼叫有缺陷,多数应用 ACTION_DIAL,ACTION_CALL 不能用在紧急呼叫上,紧急呼叫可以用 ACTION_DIAL 来实现)
ACTION_SEND 传递数据,被传送的数据没有指定,接收的 action 请求用户发数据
ACTION_SENDTO 发送一条信息到指定的某人
ACTION_ANSWER 处理一个打进电话呼叫
ACTION_INSERT 插入一条空项目到已给的容器
ACTION_DELETE 从容器中删除已给的数据
ACTION_RUN 运行数据
ACTION_SYNC 同步执行一个数据
ACTION_PICK_ACTIVITY 为以为的 Intent 选择一个 Activity,返回别选中的类
ACTION_SEARCH 执行一次搜索
ACTION_WEB_SEARCH 执行一次 web 搜索
ACTION_FACTORY_TEST 工场测试的主要进入点

(3)Category(类别)

Category用于为Action提供额外的附加类别信息,两者通常结合使用。
如果Intent设置了category,那么Intent中存在的所有的category都必须和Android Manifest.xml中对应组件的Intent-filter中的category相同,才能和这个Activity匹配。
常用的Category

名称 组件类别
CATEGORY_DEFAULT Android系统中默认的执行方式,按照普通Activity的执行方式执行
CATEGORY_HOME 设置该组件为Home Activity
CATEGORY_PREFERENCE 设置该组件为Preference
CATEGORY_LAUNCHER 设置为当前应用程序优先级最高的Activity,通常与ACTION_MAIN配合使用
CATEGORY_BROWSABLE 设置该组件可以使用浏览器启动
CATEGORY_GADGET 设置该组件可以内嵌到另外的Activity中

(4)Data(数据)

通常用于向Action属性提供操作的数据,接受一个URI对象。匹配规则与Action类似。
下面我们通过实践来使用data隐式启动百度网页。
再在activity_main.xml文件下添加另一个Button控件,然后直接在MainActivity添加点击按钮的的方法,xml布局中Button控件中添加OnClick属性设置回调方法:

  public void buttonThree(View view){         Intent intent = new Intent(Intent.ACTION_VIEW);         intent.setData(Uri.parse("http://www.baidu.com"));         startActivity(intent);     } 
android:onClick="buttonThree" 

现在点击按钮就会直接跳转到浏览器的百度页面,当然这里如果你的手机里有多个可打开网址的app,还会弹出一个对话框让你自己选择。
intent-filter中的data标签主要可配置以下内容:

名称 作用
android:scheme 用于指定数据的协议部分,如上例中的http部分
android:host 用于指定数据的主机名部分,如上例中的www.baidu.com部分
android:port 用于指定数据的端口部分,一般紧随在主机名之后
android:path 用于指定主机名与端口之后的部分,如一段网址中跟在域名之后的内容
android:mimeType 用于指定可以处理的数据类型,允许使用通配符的方式进行指定

只有<data>标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能够响应该Intent。

(5)Type(数据类型)

Intent 的 Type 属性显示指定 Intent 的数据类型(MIME)。通常 Intent 的数据类型可以从 Data 自身判断出来,但是一旦指定了 Type 类型,就会强制使用 Type 指定的类型而不再进行推导。

(6)Extra(附加信息)

Intent 的 Extra 属性用于添加一些组件的附加信息。比如,要通过一个 Activity 执行“发送电子邮件”这个动作请求,可以将电子邮件的 subject、body 等保存在 Extras 里,传给电子邮件发送组件。

(7)flag(标记)

flag在 Intent 类中定义,充当 Intent 的元数据。flag可以指示 Android 系统如何启动 Activity(例如,Activity 应属于哪个任务),以及启动之后如何处理(例如,Activity 是否属于最近的 Activity 列表)。

传值

(1)向下一个活动传值

我们上面已经学过如何显式启动一个新的activity了,现在我们来学怎么给下一个活动传值。新建一个活动FourthActivity以及fourth_layout布局,在MainActivity中我们再写一个新的方法,实例化Intent对象,通过putExtra(“name”,data)给我们实例化的intent对象设置一个值,让他可以通过startActivity将值传输到下一个活动。(这里的name是一个标识符,取值需要通过这个标识符来取,data是我们要传输的数据)

 public void buttonFour(View view){         Intent intent = new Intent(MainActivity.this, FourthActivity.class);         intent.putExtra("extra_data","Make it real!");         startActivity(intent);     } 

运行发现并没有值出现,这是因为我们传值了,但是没有在FourthActivity中把值取出来。这个时候我们需要在FourthActivity中去获取这个intent,就需要用到getIntent()方法了,再通过intent.getStringExtra(“标识符”);来获取数据,然后用display()方法让我们的数据显示出来吧。
在FourthActivity中添加代码:

Intent intent = getIntent();         String data = intent.getStringExtra("extra_data");         display(data);//这部分添加到onCreate方法中 
public void display(String data){         TextView textView = findViewById(R.id.text_1);         textView.setText(data);     } 

现在点击按钮,我们可以发现我们成功把值传到了下一个活动啦。这就是向下一个活动传值的方法。下面我们来介绍怎么向上一个活动返回数据。

(2)向上一个活动传值

既然可以传值给下一个活动,当然要实现返回数据给上一个活动才比较人性化呀~所以我们现在来学学如何通过intent给上一个活动返回数据。
首先把我们MainActivity中的的startActivity()方法改为startActivityForResult()方法。这是不影响我们向下一个活动传值的,但是通过这个方法,我们就可以在下一个活动被销毁的时候给上一个活动返回数据。

startActivityForResult(intent,1); 

在activity_main中添加一个TextView控件以显示我们从FourthActivity获取到的值,并在MainActivity中添加文字显示的方法display();

<TextView         android:id="@+id/text_1"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:layout_marginTop="20dp"         android:layout_marginLeft="20dp"         android:layout_marginRight="20dp"         android:text="这是一个用来显示由下一个Activity传回来的值的TextView"         android:gravity="center_horizontal" /> 
 public void display(String data){         TextView textView = findViewById(R.id.text_1);         textView.setText(data);     } 

给fourth_layout添加一个按钮,然后在FourthActivity中我们来写一个方法,实现点击事件并在方法中添加返回数据的逻辑。SetResult方法是专门向上一个活动返回数据的,第一个参数用于向上一个活动返回处理结果,一般只是用RESULT_OK或RESULT_CANCELED两个值;第二个参数则是我们要返回的带有数据的intent对象。最后调用finish()方法销毁当前活动返回到上一个活动。

   public void buttonBack(View view){         Intent intent = new Intent();         intent.putExtra("data_return","Let's make it real!");         setResult(RESULT_OK,intent);         finish();     } 

由于我们是使用startActivityForResult()方法来启动下一个活动的,因此在下一个活动被销毁之后会回调上一个活动的onActivityResult()方法,因此我们需要在MainActivity中重写该方法来获取数据。

 @Override     protected void onActivityResult(int requestCode, int resultCode,Intent data) {         super.onActivityResult(requestCode, resultCode, data);         switch (requestCode) {             case 1:                 if (resultCode == RESULT_OK) {                     String returnedData = data.getStringExtra("data_return");                     Log.d("MainActivity", returnedData);                     display(returnedData);                 }                 break;             default:         }     } 

onActivityResult()方法中有三个参数,相信大家都觉得很眼熟,就是我们上面设置过的requestCode、resultCode以及带着返回数据的Intent。由于在一个活动中有可能调用startActivityForResult()方法去启动很多不同的活动,所以requestCode的值有可能不同,所以我们需要判断requestCode的数据来源,确定数据是否是从FourActivity传过来的,再通过resultCode判断处理结果是否成功,最后再从intent中取值并把值显示出来。
现在点击按钮我们就能把FourthActivity中Intent设置的值传到MainActivity中并显示出来啦。

四大组件:https://blog.csdn.net/xchaha/article/details/80398620

 鉴于可能还有人没去了解Android四大组件,这里推一个博客大家可以看看,我们本节课Intent就与Android四大组件之三(活动、广播、服务)密切相关) 

参考资料

郭神的《第一行代码》
Intent和Intent过滤器
Android Intent:不同应用程序之间通信的桥梁
Android中的Intent和Intent-filter总结

本文转自互联网,侵权联系删除Android Intent:Android系统的通信桥梁

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » Android Intent:Android系统的通信桥梁
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们