Android开发学习笔记:浅谈显示Intent和隐式Intent

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://liangruijun.blog.51cto.com/3061169/655132

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

 1     <?xml version="1.0" encoding="utf-8"?>
 2     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3         android:orientation="vertical"
 4         android:layout_width="fill_parent"
 5         android:layout_height="fill_parent"
 6         >
 7         <TextView
 8             android:layout_width="fill_parent"
 9             android:layout_height="wrap_content"
10             android:text="@string/hello1"
11             />
12         <Button
13             android:id="@+id/btn"
14             android:layout_width="wrap_content"
15             android:layout_height="wrap_content"
16             android:text="转到SecondActivity"
17             />
18     </LinearLayout> 

second.xml

 1     <?xml version="1.0" encoding="utf-8"?>
 2     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3         android:orientation="vertical"
 4         android:layout_width="fill_parent"
 5         android:layout_height="fill_parent"
 6         >
 7         <TextView
 8             android:layout_width="fill_parent"
 9             android:layout_height="wrap_content"
10             android:text="@string/hello2"
11             />
12         <Button
13             android:id="@+id/secondBtn"
14             android:layout_width="wrap_content"
15             android:layout_height="wrap_content"
16             android:text="返回"
17             />
18     </LinearLayout> 

MainActivity.java

 1     package com.android.test.activity;
 2
 3     import android.app.Activity;
 4     import android.content.Intent;
 5     import android.os.Bundle;
 6     import android.view.View;
 7     import android.view.View.OnClickListener;
 8     import android.widget.Button;
 9
10     public class MainActivity extends Activity {
11         private Button btn;
12         @Override
13         public void onCreate(Bundle savedInstanceState) {
14             super.onCreate(savedInstanceState);
15             setContentView(R.layout.main);
16
17             btn = (Button)findViewById(R.id.btn);
18             //响应按钮btn事件
19             btn.setOnClickListener(new OnClickListener() {
20                 @Override
21                 public void onClick(View v) {
22                     //显示方式声明Intent,直接启动SecondActivity
23                     Intent it = new Intent(MainActivity.this,SecondActivity.class);
24                     //启动Activity
25                     startActivity(it);
26                 }
27             });
28         }
29     } 

SecondActivity.java

 1     package com.android.test.activity;
 2
 3     import android.app.Activity;
 4     import android.content.Intent;
 5     import android.os.Bundle;
 6     import android.view.View;
 7     import android.view.View.OnClickListener;
 8     import android.widget.Button;
 9
10     public class SecondActivity extends Activity {
11         private Button secondBtn;
12         @Override
13         protected void onCreate(Bundle savedInstanceState) {
14             super.onCreate(savedInstanceState);
15             setContentView(R.layout.second);
16
17             secondBtn=(Button)findViewById(R.id.secondBtn);
18             //响应按钮secondBtn事件
19             secondBtn.setOnClickListener(new OnClickListener() {
20                 @Override
21                 public void onClick(View v) {
22                     //显示方式声明Intent,直接启动MainActivity
23                     Intent intent = new Intent(SecondActivity.this,MainActivity.class);
24                     //启动Activity
25                     startActivity(intent);
26                 }
27             });
28         }
29     } 

AndroidManifest.xml清单文件,16~18行为SecondActivity在清单文件里的声明

 1     <?xml version="1.0" encoding="utf-8"?>
 2     <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3           package="com.android.test.activity"
 4           android:versionCode="1"
 5           android:versionName="1.0">
 6         <uses-sdk android:minSdkVersion="10" />
 7
 8         <application android:icon="@drawable/icon" android:label="@string/app_name">
 9             <activity android:name=".MainActivity"
10                       android:label="@string/app_name">
11                 <intent-filter>
12                     <action android:name="android.intent.action.MAIN" />
13                     <category android:name="android.intent.category.LAUNCHER" />
14                 </intent-filter>
15             </activity>
16             <activity android:name=".SecondActivity"
17                       android:label="@string/app_name">
18             </activity>
19         </application>
20     </manifest> 

效果图:

二.隐式Intent

下面是同一应用程序中的Activity切换的例子,需要AndroidManifest.xml中增加Activity的声明,并设置对应的Intent Filter和Action,才能被Android的应用程序框架所匹配。

MainActivity.java

 1     package com.android.change.activity;
 2
 3     import android.app.Activity;
 4     import android.content.Intent;
 5     import android.os.Bundle;
 6     import android.view.View;
 7     import android.view.View.OnClickListener;
 8     import android.widget.Button;
 9
10     public class MainActivity extends Activity {
11         private Button btn;
12
13         @Override
14         public void onCreate(Bundle savedInstanceState) {
15             super.onCreate(savedInstanceState);
16             setContentView(R.layout.main);
17
18             btn = (Button) findViewById(R.id.btn);
19             // 响应按钮btn事件
20             btn.setOnClickListener(new OnClickListener() {
21                 @Override
22                 public void onClick(View v) {
23                     // 实例化Intent
24                     Intent it = new Intent();
25                     //设置Intent的Action属性
26                     it.setAction("com.android.activity.MY_ACTION");
27                     // 启动Activity
28                     startActivity(it);
29                 }
30           });
31         }
32     }  

SecondActivity.java

 1     package com.android.change.activity;
 2
 3     import android.app.Activity;
 4     import android.os.Bundle;
 5
 6     public class SecondActivity extends Activity {
 7
 8         @Override
 9         protected void onCreate(Bundle savedInstanceState) {
10             super.onCreate(savedInstanceState);
11             setContentView(R.layout.second);
12         }
13     }  

main.xml

 1     <?xml version="1.0" encoding="utf-8"?>
 2     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3         android:orientation="vertical"
 4         android:layout_width="fill_parent"
 5         android:layout_height="fill_parent"
 6         >
 7         <TextView
 8             android:layout_width="fill_parent"
 9             android:layout_height="wrap_content"
10             />
11         <Button
12             android:id="@+id/btn"
13             android:layout_width="wrap_content"
14             android:layout_height="wrap_content"
15             android:text="转到SecondActivity"
16             />
17     </LinearLayout> 

seond.xml

 1     <?xml version="1.0" encoding="utf-8"?>
 2     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3        android:orientation="vertical"
 4        android:layout_width="fill_parent"
 5        android:layout_height="fill_parent"
 6        >
 7        <TextView
 8             android:layout_width="fill_parent"
 9             android:layout_height="wrap_content"
10             android:text="@string/second"
11             />
12     </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",这样就能进行匹配。

 1     <?xml version="1.0" encoding="utf-8"?>
 2     <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3           package="com.android.change.activity"
 4           android:versionCode="1"
 5           android:versionName="1.0">
 6         <uses-sdk android:minSdkVersion="10" />
 7
 8         <application android:icon="@drawable/icon" android:label="@string/app_name">
 9             <activity android:name=".MainActivity"
10                       android:label="@string/app_name">
11                 <intent-filter>
12                     <action android:name="android.intent.action.MAIN" />
13                     <category android:name="android.intent.category.LAUNCHER" />
14                 </intent-filter>
15             </activity>
16             <activity android:name=".SecondActivity" >
17             <intent-filter>
18                 <action  android:name = "com.android.activity.MY_ACTION"  />
19                 <category android:name = "android.intent.category.DEFAULT"  />
20              </intent-filter>
21             </activity>
22         </application>
23     </manifest> 

效果图:

对 于显示Intent,Android不需要再去做解析,因为目标组件很明确。Android需要解析的是隐式Intent,通过解析,将Intent映射 给可以处理该Intent的Activity,Service等。Intent的解析机制主要是通过查找已经注册在 AndroidManifest.xml中的所有IntentFilter以及其中定义的Intent,最终找到匹配的Intent。

本文出自 “IT的点点滴滴” 博客,请务必保留此出处http://liangruijun.blog.51cto.com/3061169/655132

时间: 2024-12-11 10:21:18

Android开发学习笔记:浅谈显示Intent和隐式Intent的相关文章

转 Android开发学习笔记:浅谈WebView

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangruijun.blog.51cto.com/3061169/647456 WebView(网络视图)能加载显示网页,可以将其视为一个浏览器.它使用了WebKit渲染引擎加载显示网页,实现WebView有以下两种不同的方法: 第一种方法的步骤: 1.在要Activity中实例化WebView组件:WebView webView = new WebView(this); 2

【Android开发学习笔记】【第三课】Activity和Intent

首先来看一个Activity当中启动另一个Activity,直接上代码说吧: (1)首先要多个Activity,那么首先在res-layout下新建一个 Other.xml,用来充当第二个Activity的布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu

【Android开发学习笔记】【第五课】Activity的生命周期-上

今天学习Activity当中的七个生命周期函数: 首先得说一个事情,就是在代码当中如果加入了 System.out.println(" ------");之后,如何查看这里面的输出内容 打开之后只输入“Filter Name”和“by Log Tag” 即可 添加成功后可以看到 本次学习主要总结如下: 1.onCreate() Acitivity首次创建时被调用.用于设置Acitivity的布局文件,绑定按钮监听器等一些普通静态操作. 2.onStart() Acitivity对用户可

【Android开发学习笔记】【第四课】基础控件的学习

通过一个简单的例子来学习下面几种控件: 1.TextView:简单的文本显示控件 2.EditText:可以编辑的文本框 3.Button:按钮 4.Menu:这里指的是系统的Menu 5.Toast:消息提示控件,类似于MFc的tip(不知道理解的对不对) 顺便用到上一次学习的多个Activity之间传递数据的技术,来做一个小的计算乘法的case 步骤: (1)主Activity 和显示结果的 Activity 都采用线性布局,下面是布局文件的源代码: <LinearLayout xmlns:

android 开发学习笔记 (一)

每个app 都有一个自己的 linux 进程: 每个进程都在自己的虚拟机里执行 两个app 可以跑在一个进程,一个vm里 android app 四大组件:activity,content provider,      services, broardcast receivers Content Resolver 激活 Content Provider You can start an      activity (or give it something new to do) by passi

Android开发学习笔记:数据存取之SQLite浅析

一.SQLite的介绍 1.SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持 Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl.PHP.Java.C++..Net等,还有ODBC接口,同样比起 Mysql.PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的

android开发学习笔记000

使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个一直梦想走技术流的再疯狂一次.2014.08.06. 直奔主题——>android开发学习笔记001 android开发学习笔记000

android开发学习笔记001a

Android 应用与开发环境 1.使用SDK版本:Android 2.3 . 2.发展和历史 创始人:Andy Rubin,Android公司被Google收购.07年11月5日1.0发布. 3.平台架构及特性 Linux内核(操作系统)->函数库,Android运行时(中间件)->应用程序框架->应用程序 我要学习的就是如何在android 操作系统里开发应用程序. 我们只和应用程序框架(Android API)打交道.也就是我们的SDK. 函数库是C/C++的库. Android

Android中的显示Intent和隐式Intent

1.显示Intent 在onclick方法中 Intent intent=new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent); 2.隐式Intent 隐式Intent不明确指出我们要启动哪一个活动,而是指定一系列更为抽象的action和category等信息,然后交由系统去分析这个intent,并帮我们找到合适的Intent去启动 通过标签下配置的内容,指定当前活动能够响应的action和categ

初探swift语言的学习笔记(可选类型?和隐式可选类型!)

可选类型.隐式可选类型 其次swift还引入一个较有趣的初始值设置语法使用"?"操作符及"!"号操作符 如:"var optionalString: String? = "Hello" optionalString == nil var optionalName: String? = "John Appleseed" var greeting = "Hello!" if let name = op