Android Intent Action有什么用?

是的,虽然做Android开发有差不多两年了,但是很羞愧的是说实话我真的不知道intent-filter是干什么用的。

今天有空终于看了看intent-filter中的action。


在讲action之前,我跟大家回忆一个场景。用过Android手机的人应该都知道,比如说我在某个App例如新浪微博中点击拍照,会跳转到照相机的界面。但是当我新装了camer360或之类的第三方照相app的时候在微博中点击照相就会先弹出一个Dialog来让我选择是使用默认camer还是camer360.


ok,在讲完刚刚那个场景之后我给大家介绍一下显示intent 与隐式intent。

对于明确指出了目标组件名称的Intent,我们称之为“显式Intent”。对于没有明确指出目标组件名称的Intent,则称之为“隐式 Intent”。Android系统使用IntentFilter 来寻找与隐式Intent相关的对象。(关于IntentFilter我们马上就会讲到。)

显式Intent直接用组件的名称定义目标组件,这种方式很直接。但是由于开发人员往往并不清楚别的应用程序的组件名称,因此,显式Intent更 多用于在应用程序内部传递消息。比如在某应用程序内,一个Activity启动一个Service。隐式Intent恰恰相反,它不会用组件名称定义需要 激活的目标组件,它更广泛地用于在不同应用程序之间传递消息。


在通常的HelloWorld中使用的都是显示Intent,即需要指明跳转的activity对象,如:Intent intent = new Intent(MainActivity.this,BActivity.class);

如果要跳转到一个未知路径,但是已知功能的Activity就要用到隐式intent,如;Intent intent = new Intent(Intent.ACTION_SEND);

===========================================================================================================

好的,应该讲到这里大家或许已经知道activity的作用的,如果仍然不清楚也没关系,我们下面讲实例:

实例一:

有三个Activity:MainActivity.java/BAcitvity.java/CActivity.java

假设这是一个照相应用MainActivity是程序入口,BActivity和CActivity都可以处理照相的内容。

在我们不会使用action的时候我们要使这个应用既可以使用BActivity照相,又能使用CActivity照相如何实现?

当然是在MainActivity中写两个Button,

new Intent(MainActivity.this,BActivity.class);

new Intent(MainActivity.this,CActivity.class);

通过两种不同的Intent来发起请求。


那么如何使用action来实现呢?

在xml中先这样定义:

[html]  view plain copy
  1. <activity  
  2.     android:name=".MainActivity"  
  3.     android:label="@string/title_activity_main" >  
  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.   
  11. <activity  
  12.     android:name=".BActivity"  
  13.     android:label="@string/title_activity_main"  
  14.     android:launchMode="singleTask" >  
  15.     <intent-filter>  
  16.         <action android:name="com.h3c.intent.ACTION_VIEW"></action>    
  17.         <category android:name="android.intent.category.DEFAULT"></category>   
  18.     </intent-filter>  
  19. </activity>  
  20.   
  21. <activity  
  22.     android:name=".CActivity"  
  23.     android:label="@string/title_activity_main" >  
  24.     <intent-filter>  
  25.         <action android:name="com.h3c.intent.ACTION_VIEW"></action>    
  26.         <category android:name="android.intent.category.DEFAULT"></category>   
  27.     </intent-filter>  
  28. </activity>  

我们在MainActivity中实现一个Button,点击发送:

new Intent("com.h3c.intent.ACTION_VIEW");

此时就会弹出一个Dialog让我们自动选择是使用BActivity还是使用CActiviy了,就如前文我提到camer360的那个例子

这也就是隐式intent,即发送一种类型的action,可以让所有支持该类型的activity都收到消息,然后由用户选择使用哪个activity处理。


实例二:(Android分享与接收分享)

自己之前其实也接触过action,但是没有自己的去想清楚。比如在做DLNA这个项目的时候需要支持第三方媒体app分享给DLNA,如何实现呢?

首先看看如何分享给别人:

[java]  view plain copy
  1. public static void shareText(Context context, String title, String text) {  
  2.     Intent intent = new Intent(Intent.ACTION_SEND);  
  3.     intent.setType("text/plain");  
  4.     intent.putExtra(Intent.EXTRA_SUBJECT, title);  
  5.     intent.putExtra(Intent.EXTRA_TEXT, text);  
  6.     context.startActivity(Intent.createChooser(intent, title));  
  7. }  
就是用上文提到的隐式intent,因为我并不知道有那些应用可以支持分享,所以我用隐式intent发起分享这一类的请求。


我们再看如何支持分享:

[html]  view plain copy
  1. <activity android:name=".SharePage" android:label="分享到微博">  
  2.     <intent-filter>  
  3.         <action android:name="android.intent.action.SEND" />  
  4.         <category android:name="android.intent.category.DEFAULT" />  
  5.         <data android:mimeType="image/*" />  
  6.     </intent-filter>  
  7. </activity>  
是的,使用action告诉别人我支持SEND这类隐式intent,注意必须也有这样一句话,否则运行会报错。
[html]  view plain copy
  1. <category android:name="android.intent.category.DEFAULT" />  
最后通过data约束一下格式。


大家应该跟我一样终于明白action的用法了吧!

你可能感兴趣的:(android,intent,actio)