Android开发学习之浅谈显示Intent和隐式Intent
Intent寻找目标组件的两种方式:
- 显式Intent:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的。
 - 隐式Intent:通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间。
 
一.显式Intent
一般情况下,一个Android应用程序中需要多个屏幕,即是多个Activity类,并且在这些Activity之间进行切换通过Intent机制来实现的。在同一个应用程序中切换Activity时,我们通常都知道要启动的Activity具体是哪一个,因此常用显式的Intent来实现的。
下面的例子是在同一应用程序中MainActivity启动SecondActivity,下面的代码中,主要是为“转到SecondActivity”按钮添加了OnClickListener,使得按钮被点击时执行onClick()方法,onClick()方法中则利用了Intent机制,来启动SecondActivity,关键的代码是22~25行。
main.xml
- <?xmlversion="1.0"encoding="utf-8"?>
 - <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
 - android:orientation="vertical"
 - android:layout_width="fill_parent"
 - android:layout_height="fill_parent"
 - >
 - <TextView
 - android:layout_width="fill_parent"
 - android:layout_height="wrap_content"
 - android:text="@string/hello1"
 - />
 - <Button
 - android:id="@+id/btn"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:text="转到SecondActivity"
 - />
 - </LinearLayout>
 
second.xml
- <?xmlversion="1.0"encoding="utf-8"?>
 - <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
 - android:orientation="vertical"
 - android:layout_width="fill_parent"
 - android:layout_height="fill_parent"
 - >
 - <TextView
 - android:layout_width="fill_parent"
 - android:layout_height="wrap_content"
 - android:text="@string/hello2"
 - />
 - <Button
 - android:id="@+id/secondBtn"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:text="返回"
 - />
 - </LinearLayout>
 
MainActivity.java
- package com.android.test.activity;
 - import android.app.Activity;
 - import android.content.Intent;
 - import android.os.Bundle;
 - import android.view.View;
 - import android.view.View.OnClickListener;
 - import android.widget.Button;
 - publicclass MainActivity extends Activity {
 - private Button btn;
 - @Override
 - publicvoid onCreate(Bundle savedInstanceState) {
 - super.onCreate(savedInstanceState);
 - setContentView(R.layout.main);
 - btn = (Button)findViewById(R.id.btn);
 - //响应按钮btn事件
 - btn.setOnClickListener(new OnClickListener() {
 - @Override
 - publicvoid onClick(View v) {
 - //显示方式声明Intent,直接启动SecondActivity
 - Intent it = new Intent(MainActivity.this,SecondActivity.class);
 - //启动Activity
 - startActivity(it);
 - }
 - });
 - }
 - }
 
SecondActivity.java
- package com.android.test.activity;
 - import android.app.Activity;
 - import android.content.Intent;
 - import android.os.Bundle;
 - import android.view.View;
 - import android.view.View.OnClickListener;
 - import android.widget.Button;
 - publicclass SecondActivity extends Activity {
 - private Button secondBtn;
 - @Override
 - protectedvoid onCreate(Bundle savedInstanceState) {
 - super.onCreate(savedInstanceState);
 - setContentView(R.layout.second);
 - secondBtn=(Button)findViewById(R.id.secondBtn);
 - //响应按钮secondBtn事件
 - secondBtn.setOnClickListener(new OnClickListener() {
 - @Override
 - publicvoid onClick(View v) {
 - //显示方式声明Intent,直接启动MainActivity
 - Intent intent = new Intent(SecondActivity.this,MainActivity.class);
 - //启动Activity
 - startActivity(intent);
 - }
 - });
 - }
 - }
 
AndroidManifest.xml清单文件,16~18行为SecondActivity在清单文件里的声明
- <?xmlversion="1.0"encoding="utf-8"?>
 - <manifestxmlns:android="http://schemas.android.com/apk/res/android"
 - package="com.android.test.activity"
 - android:versionCode="1"
 - android:versionName="1.0">
 - <uses-sdkandroid:minSdkVersion="10"/>
 - <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
 - <activityandroid:name=".MainActivity"
 - android:label="@string/app_name">
 - <intent-filter>
 - <actionandroid:name="android.intent.action.MAIN"/>
 - <categoryandroid:name="android.intent.category.LAUNCHER"/>
 - </intent-filter>
 - </activity>
 - <activityandroid:name=".SecondActivity"
 - android:label="@string/app_name">
 - </activity>
 - </application>
 - </manifest>
 
效果图:


二.隐式Intent
下面是同一应用程序中的Activity切换的例子,需要AndroidManifest.xml中增加Activity的声明,并设置对应的Intent Filter和Action,才能被Android的应用程序框架所匹配。
MainActivity.java
- package com.android.change.activity;
 - import android.app.Activity;
 - import android.content.Intent;
 - import android.os.Bundle;
 - import android.view.View;
 - import android.view.View.OnClickListener;
 - import android.widget.Button;
 - publicclass MainActivity extends Activity {
 - private Button btn;
 - @Override
 - publicvoid onCreate(Bundle savedInstanceState) {
 - super.onCreate(savedInstanceState);
 - setContentView(R.layout.main);
 - btn = (Button) findViewById(R.id.btn);
 - // 响应按钮btn事件
 - btn.setOnClickListener(new OnClickListener() {
 - @Override
 - publicvoid onClick(View v) {
 - // 实例化Intent
 - Intent it = new Intent();
 - //设置Intent的Action属性
 - it.setAction("com.android.activity.MY_ACTION");
 - // 启动Activity
 - startActivity(it);
 - }
 - });
 - }
 - }
 
SecondActivity.java
- package com.android.change.activity;
 - import android.app.Activity;
 - import android.os.Bundle;
 - publicclass SecondActivity extends Activity {
 - @Override
 - protectedvoid onCreate(Bundle savedInstanceState) {
 - super.onCreate(savedInstanceState);
 - setContentView(R.layout.second);
 - }
 - }
 
main.xml
- <?xmlversion="1.0"encoding="utf-8"?>
 - <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
 - android:orientation="vertical"
 - android:layout_width="fill_parent"
 - android:layout_height="fill_parent"
 - >
 - <TextView
 - android:layout_width="fill_parent"
 - android:layout_height="wrap_content"
 - />
 - <Button
 - android:id="@+id/btn"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:text="转到SecondActivity"
 - />
 - </LinearLayout>
 
seond.xml
- <?xmlversion="1.0"encoding="utf-8"?>
 - <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
 - android:orientation="vertical"
 - android:layout_width="fill_parent"
 - android:layout_height="fill_parent"
 - >
 - <TextView
 - android:layout_width="fill_parent"
 - android:layout_height="wrap_content"
 - android:text="@string/second"
 - />
 - </LinearLayout>
 
AndroidManifest.xml文件的18,19行修改了Intent Filter,这样SecondActivity才能够接收到MainActivity发送的Intent。因为在MainActivity的Intent发送的动作为"com.android.activity.MY_ACTION",而在18行里,SecondActivity设置的Action也为"com.android.activity.MY_ACTION",这样就能进行匹配。
- <?xmlversion="1.0"encoding="utf-8"?>
 - <manifestxmlns:android="http://schemas.android.com/apk/res/android"
 - package="com.android.change.activity"
 - android:versionCode="1"
 - android:versionName="1.0">
 - <uses-sdkandroid:minSdkVersion="10"/>
 - <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
 - <activityandroid:name=".MainActivity"
 - android:label="@string/app_name">
 - <intent-filter>
 - <actionandroid:name="android.intent.action.MAIN"/>
 - <categoryandroid:name="android.intent.category.LAUNCHER"/>
 - </intent-filter>
 - </activity>
 - <activityandroid:name=".SecondActivity">
 - <intent-filter>
 - <actionandroid:name = "com.android.activity.MY_ACTION"/>
 - <categoryandroid:name = "android.intent.category.DEFAULT"/>
 - </intent-filter>
 - </activity>
 - </application>
 - </manifest>
 
效果图:
 
对于显示Intent,Android不需要再去做解析,因为目标组件很明确。Android需要解析的是隐式Intent,通过解析,将Intent映射给可以处理该Intent的Activity,Service等。Intent的解析机制主要是通过查找已经注册在AndroidManifest.xml中的所有IntentFilter以及其中定义的Intent,最终找到匹配的Intent。
Android开发学习之浅谈显示Intent和隐式Intent的更多相关文章
- Android -- 两个activity界面的切换, 显示Intent 和 隐式Intent,putExtra传递数据
		
1. 两个Activity之间可以通过Intent切换, 包括显示Intent 和 隐式Intent. 实例代码 MainActivity.java public class MainActivity ...
 - 显式Intent 和隐式 Intent 的区别
		
显式 Intent : 在知道目标组件名称的前提下,去调用Intent.setComponent().Intent.setClassName()或Intent.setClass()方法或者在new I ...
 - Android开发学习笔记:浅谈显示Intent和隐式Intent
		
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangruijun.blog.51cto.com/3061169/655132 ...
 - 在Android中Intent的概念及应用(一)——显示Intent和隐式Intent
		
Intent寻找目标组件的两种方式: 显式Intent:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的. 隐式Intent:通过Intent ...
 - 【Android】6.0 添加Menu菜单组件、Intent启动活动、显式Intent、隐式Intent
		
1.0 在helloworld项目基础上创建活动SecondActivity: 2.0 其中main.xml: <?xml version="1.0" encoding=&q ...
 - 2018.7.9 Android—显式Intent和隐式Intent的区别
		
1:都是用来在一个activity中启动另外一个activity 2:显示Intent直接指明要启动activity的定义,即activity.class:隐式intent通过在androidmani ...
 - 显式Intent和隐式Intent
		
http://blog.csdn.net/qs_csu/article/details/7995966 对于明确指出了目标组件名称的Intent,我们称之为“显式Intent”. 对于没有明确指出目标 ...
 - android开发学习---layout布局、显示单位和如何进行单元测试
		
一.五大布局(layout) android中的用五大布局:LinearLayout (线性布局).AbsoluteLayout(绝对布局).RelativeLayout(相对布局).TableLay ...
 - 从0系统学Android-2.4隐式Intent
		
本系列文章,参考<第一行代码>,作为个人笔记 更多内容:更多精品文章分类 使用隐式 Intent 相对于显示 Intent ,隐式 Intent 比较含蓄.这种方式不明确指出我们想要启动哪 ...
 
随机推荐
- 【BZOJ】【3675】【APIO2014】序列分割
			
DP+斜率优化 首先我们根据这个分割的过程可以发现:总得分等于k+1段两两的乘积的和(乘法分配律),也就是说与分割顺序是无关的. 再对乘积进行重分组(还是乘法分配律)我们可以转化为:$ans=\sum ...
 - linux用户管理中两个重要的“父子”配置文件
			
在Linux中主要通过用户配置文件来查看和修改用户信息,因此下面我们将介绍两个重要的用户配置文件,让你能够更好的hold住你的用户. 一:父文件/etc/passwd 1.查看配置文件/etc/pas ...
 - electron项目中使用jquery不生效的解决方法
			
才开始接触electron的时候,本来想用bootstrap快速搞一个demo,无奈有些功能没法用,之后才意识到是jquery没发用,之后找了一些资料,比较简单的方式就是在引入jquery之前加入一下 ...
 - OAuth 2.0 Authorization Framework RFC
			
Internet Engineering Task Force (IETF) D. Hardt, Ed.Request for Comments: 6749 MicrosoftObsoletes: 5 ...
 - 6. Activity life cycle
			
An activity can exist in essentially three states: Resumed The activity is in the foreground of the ...
 - Linux上安装Bugzilla4.4小记
			
因项目需要,我受命在一台Linux服务器上搭建一个Bugzilla,进过一天的调试,这项任务总算完成了.现在可以肯定的说,安装过程不复杂,基本就是解压,填参数,执行命令.Bugzilla要跑起来,本机 ...
 - css选择器顺序的小技巧
			
在线演示 本地下载 css的选择器的顺序其实很有意思,如果应用的好的话,可以做一些简单的逻辑出来,配合上css3,就可以尽可能的脱离js了. 这里的演示是一个带有hover事件的四张照片,效果来自一个 ...
 - 翻译记忆软件-塔多思TRADO经典教程_4
			
SDL Trados是世界上最流行的计算机辅助翻译(CAT) 软件,在全球拥有20万多客户,全球500强企业有超过90%的公司都在使用SDL Trados来为日常的本地化翻译工作服务.我们的使命是以强 ...
 - 【转】允许远程用户登录访问mysql的方法
			
需要手动增加可以远程访问数据库的用户. 方法一.本地登入mysql,更改 "mysql" 数据库里的 "user" 表里的 "host" 项 ...
 - Objective-C中NSString与int和float的相互转换
			
NSString *tempA = @"123"; NSString *tempB = @"456"; 1,字符串拼接 NSString *newString ...