【转】Android理解:显式和隐式Intent---- try catch
原文网址:http://blog.csdn.net/xiao__gui/article/details/11392987
Intent是Android初学者比较难理解的一个东西。我这里以通俗易懂的语言和通俗易懂的代码,让初学者简单感受一下Intent。
intent就是意图的意思。Intent分两种:显式(Explicit intent)和隐式(Implicit intent)。
一、显式(设置Component)
显式,即直接指定需要打开的activity对应的类。
以下多种方式都是一样的,实际上都是设置Component直接指定Activity类的显式Intent,由MainActivity跳转到SecondActivity:
1、构造方法传入Component,最常用的方式
- Intent intent = new Intent(this, SecondActivity.class);
- startActivity(intent);
2、setComponent方法
- ComponentName componentName = new ComponentName(this, SecondActivity.class);
- // 或者ComponentName componentName = new ComponentName(this, "com.example.app016.SecondActivity");
- // 或者ComponentName componentName = new ComponentName(this.getPackageName(), "com.example.app016.SecondActivity");
- Intent intent = new Intent();
- intent.setComponent(componentName);
- startActivity(intent);
3、setClass/setClassName方法
- Intent intent = new Intent();
- intent.setClass(this, SecondActivity.class);
- // 或者intent.setClassName(this, "com.example.app016.SecondActivity");
- // 或者intent.setClassName(this.getPackageName(), "com.example.app016.SecondActivity");
- startActivity(intent);
显式Intent通过Component可以直接设置需要调用的Activity类,可以唯一确定一个Activity,意图特别明确,所以是显式的。设置这个类的方式可以是Class对象(如SecondActivity.class),也可以是包名加类名的字符串(如"com.example.app016.SecondActivity")。这个很好理解,在应用程序内部跳转界面常用这种方式。
二、隐式
隐式,即不是像显式的那样直接指定需要调用的Activity,隐式不明确指定启动哪个Activity,而是设置Action、Data、Category,让系统来筛选出合适的Activity。筛选是根据所有的<intent-filter>来筛选。
下面以Action为例:
AndroidManifest.xml文件中,首先被调用的Activity要有一个带有<intent-filter>并且包含<action>的Activity,设定它能处理的Intent,并且category设为"android.intent.category.DEFAULT"。action的name是一个字符串,可以自定义,例如我在这里设成"abcdefg":
- <activity
- android:name="com.example.app016.SecondActivity">
- <intent-filter>
- <action android:name="abcdefg"/>
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- </activity>
然后,在MainActivity,才可以通过这个action name找到上面的Activity。下面两种方式分别通过setAction和构造方法方法设置Action,两种方式效果相同。
1、setAction方法
- Intent intent = new Intent();
- intent.setAction("abcdefg");
- startActivity(intent);
2、构造方法直接设置Action
- Intent intent = new Intent("abcdefg");
- startActivity(intent);
通过设置Action字符串,表明自己的意图,即我想干嘛,需要由系统解析,找到能够处理这个Intent的Activity并启动。比如我想打电话,则可以设置Action为"android.intent.action.DIAL"字符串,表示打电话的意图,系统会找到能处理这个意图的Activity,例如调出拨号面板。
有几点需要注意:
1、
这个Activity其他应用程序也可以调用,只要使用这个Action字符串。这样应用程序之间交互就很容易了,例如手机QQ可以调用QQ空间,可以调用腾讯微博等。
因为如此,为了防止应用程序之间互相影响,一般命名方式是包名+Action名,例如这里命名"abcdefg"就很不合理了,就应该改成"com.example.app016.MyTest"。
2、
当然,你可以在自己的程序中调用其他程序的Action。
例如可以在自己的应用程序中调用拨号面板:
- Intent intent = new Intent(Intent.ACTION_DIAL);
- // 或者Intent intent = new Intent("android.intent.action.DIAL");
- // Intent.ACTION_DIAL是内置常量,值为"android.intent.action.DIAL"
- startActivity(intent);
3、一个Activity可以处理多种Action
只要你的应用程序够牛逼,一个Activity可以看网页,打电话,发短信,发邮件。。。当然可以。
Intent的Action只要是其中之一,就可以打开这个Activity。
- <activity
- android:name="com.example.app016.SecondActivity">
- <intent-filter>
- <!-- 可以处理下面三种Intent -->
- <action android:name="com.example.app016.SEND_EMAIL"/>
- <action android:name="com.example.app016.SEND_MESSAGE"/>
- <action android:name="com.example.app016.DAIL"/>
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
对于一个Action字符串,系统有可能会找到一个Activity能处理这个Action,也有可能找到多个Activity,也可能一个都找不到。
1、找到一个Activity
很简单,直接打开这个Activity。这个不需要解释。
2、找到多个Acyivity
系统会提示从多个activity中选择一个打开。
例如我们自己开发一个拨号面板应用程序,可以设置activity的<intent-filter>中Action name为"android.intent.action.DIAL",这样别的程序调用拨号器时,用户可以从Android自带的拨号器和我们自己开发的拨号器中选择。
- <activity
- android:name="com.example.app016.SecondActivity">
- <intent-filter>
- <action android:name="android.intent.action.DIAL"/>
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
这也就是当Android手机装上UC浏览器后,打开网页时会弹出选择Android自带浏览器还是UC浏览器,可能都会遇到过。
3、一个Activity都没找到
一个都没找到的话,程序就会出错,会抛出ActivityNotFoundException。比如随便写一个action字符串:
- Intent intent = new Intent("asasasas");
- startActivity(intent);
所以应该注意try catch异常。
- Intent intent = new Intent("asasasas");
- try
- {
- startActivity(intent);
- }
- catch(ActivityNotFoundException e)
- {
- Toast.makeText(this, "找不到对应的Activity", Toast.LENGTH_SHORT).show();
- }
或者也可以使用Intent的resolveActivity方法判断这个Intent是否能找到合适的Activity,如果没有,则不再startActivity,或者可以直接禁用用户操作的控件。
- Intent intent = new Intent(Intent.ACTION_DIAL);
- if(intent.resolveActivity(getPackageManager()) == null)
- {
- // 设置控件不可用
- }
注意resolveActivity方法返回值就是显式Intent上面讲到的ComponentName对象,一般情况下也就是系统找到的那个Activity。但是如果有多个Activity可供选择的话,则返回的Component是com.android.internal.app.ResolverActivity,也就是用户选择Activity的那个界面对应的Activity,这里不再深究。
- Intent intent = new Intent(Intent.ACTION_DIAL);
- ComponentName componentName = intent.resolveActivity(getPackageManager());
- if(componentName != null)
- {
- String className = componentName.getClassName();
- Toast.makeText(this, className, Toast.LENGTH_SHORT).show();
- }
作者:叉叉哥 转载请注明出处:http://blog.csdn.net/xiao__gui/article/details/11392987
【转】Android理解:显式和隐式Intent---- try catch的更多相关文章
- dll的加载方式主要分为两大类,显式和隐式链接
之前简单写过如何创建lib和dll文件及简单的使用(http://blog.csdn.net/betabin/article/details/7239200).现在先再深入点写写dll的加载方式. d ...
- 显式与隐式(ExplicitAndImplicit)
显式与隐式(Explicit And Implicit) 1.概念 1.1 显式 实现的单词Explicit意思是清楚的.明确的.详述的.所以,显式的“显”是指明显且清楚的实现,相对于接口来说,就是明 ...
- 【RS】CoupledCF: Learning Explicit and Implicit User-item Couplings in Recommendation for Deep Collaborative Filtering-CoupledCF:在推荐系统深度协作过滤中学习显式和隐式的用户物品耦合
[论文标题]CoupledCF: Learning Explicit and Implicit User-item Couplings in Recommendation for Deep Colla ...
- C++ 不具有继承关系的类之间的显式,隐式转换 2013-07-11 15:41
好久没有写blog了,今天在学习c#的时候看到某一章节 讲类的隐式与显式转换.特此留笔,以供后续参考之用. 关于显式,隐式转换有些争论,说什么不建议隐式转换.但是个人认为非必要,如果有良好的基础书写基 ...
- 实例理解scala 隐式转换(隐式值,隐式方法,隐式类)
作用 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型.话不多说,直接测试 ImplicitHel ...
- Scala中的Implicit(隐式转换,隐式参数,隐式类)
文章来自:http://www.cnblogs.com/hark0623/p/4196452.html 转发请注明 代码如下: /** * 隐式转换 隐式参数 隐式类 */ //隐式转换 class ...
- (转载)Android理解:显式和隐式Intent
Intent分两种:显式(Explicit intent)和隐式(Implicit intent). 一.显式(设置Component) 显式,即直接指定需要打开的activity对应的类. 以下多种 ...
- Android Studio Intent使用(显式、隐式)
https://blog.csdn.net/u012005313/article/details/47006689 使用Intent能够使程序在不同活动中跳转,意及能够使用不同界面.Intent用法分 ...
- (三)使用Intent在活动中穿梭:显式和隐式Intent
一.显式Intent @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstan ...
随机推荐
- php 链式操作的实现 学习记录
php 面向对象中实现链式操作的关键部分:调用的方法中返回当前对象 ,从而实现链式操作: <?php namespace commom; class db { public function w ...
- Decorator Wrapper 装饰模式 包装
简介 装饰模式 装饰模式以对客户端[透明]的方式[扩展]对象的功能,客户端并不会觉得对象在装饰前和装饰后有什么不同,是继承关系的一个替代方案. 若只为增加功能而使用继承,当基类较多时会导致继承体系越来 ...
- js页面加载事件
<body onload="myfunction()" > </body> <script type="text/javascript&qu ...
- 关于c#流
C#流的简单认识 前言 本篇文章简单总结了在C#编程中经常会用到的一些流.比如说FileStream.MemoryStream. BufferedStream. NetWorkStream. Str ...
- MySQL无法登录服务器解决方法
提示:#2000 无法登录 MySQL 服务器 今天用本机装了个phpMyAdmin,版本3.4.8,想用它来连一台内网服务器上的Mysql,于是乎修改phpMyAdmin配置文件config.inc ...
- excel - 相等判断
函数使用例子: =IF(EVALUATE(B23)=C23,"正确","错误") 即判断单元格'B23'与'C23'是否相等,若为true,则返回"正 ...
- XMLHelper 类
这个XMLHelper类中包括了XML文档的创建,文档节点和属性的读取,添加,修改,删除的方法功能的实现,有兴趣的朋友,可以进来看看,所有代码都在WebForm和WinForm中调试通过. 这是下面 ...
- WPF命令
WPF的命令是经常使用的,在MVVM中,RelayCommand更是用得非常多,但是命令的本质究竟是什么,有了事件为什么还要命令,命令与事件的区别是什么呢?MVVM里面是如何包装命令的呢?命令为什么能 ...
- ASP.NET菜鸟之路之Seesion小例子
背景 我是一个ASP.NET菜鸟,暂时开始学习ASP.NET,在此记录下我个人敲的代码,没有多少参考价值,请看到的盆友们为我点个赞支持我一下,多谢了. Session介绍 Session保存特定用户相 ...
- hello,boke
我一名学习软件工程金融服务工程的学生,简单来说就是学习计算机类的,对于自己的介绍,从平时生活中来说吧,我一直处于一种很中规中矩的生活状态里,平时玩玩手机.追追剧.和室友一起去图书馆自习,考前拼命复习两 ...