`

Android学习---Intent学习

阅读更多

一、Intent的用途

    首先,我们来看api的类总结:

    

An intent is an abstract description of an operation to be performed. It can be used with startActivity to launch an Activity, broadcastIntent to send it to any interested BroadcastReceiver components, and startService(Intent) or bindService(Intent, ServiceConnection, int) to communicate with a background Service.

An Intent provides a facility for performing late runtime binding between the code in different applications. Its most significant use is in the launching of activities, where it can be thought of as the glue between activities. It is basically a passive data structure holding an abstract description of an action to be performed.

    intent是一个即将操作的一个抽象的描述。它能被startActivity方法调用去启动一个Activity,, broadcastIntent发送给任何对它感兴趣的  BroadcastReceiver 组件,和他也能用作 startService(Intent) 或者 bindService(Intent, ServiceConnection, int)与运行后台的Service进行交互。

   一个Intent提供了一种实际的绑定在不同的应用程序。它最经常被用于启动Activity,我们可以认为它是不同的activities的粘合剂,其实从最基本来说它一种数据结构用来描述我们即将启动的Acitivy的描述。

二、Intent匹配

   Intent传递过程中,要找到目标消费者(另一个Activity,IntentReceiverService),也就是Intent的响应者,有两种方法来匹配: 

1.显示匹配(Explicit): 
  

public TestB extents Activity
{
 .........
};
 public class Test extends Activity
{
     ......
     public void switchActivity()
     {
            Intent i = new Intent(Test.this, TestB.class);
            this.startActivity(i);
     }
}

 2.隐式匹配(Implicit):
   
  
隐式匹配,首先要匹配Intent的几项值:Action, Category, Data/Type,Component
如果填写了Componet就是上例中的Test.class)这就形成了显示匹配。所以此部分只讲前几种匹配。匹配规则为最大匹配规则,

1
,如果你填写了Action,如果有一个程序的Manifest.xml中的某一个ActivityIntentFilter段中定义了包含了相同的Action那么这个Intent就与这个目标Action匹配,如果这个Filter段中没有定义Type,Category,那么这个Activity就匹配了。但是如果手机中有两个以上的程序匹配,那么就会弹出一个对话可框来提示说明。
Action
的值在Android中有很多预定义,如果你想直接转到你自己定义的Intent接收者,你可以在接收者的IntentFilter中加入一个自定义的Action值(同时要设定Category值为"android.intent.category.DEFAULT"),在你的Intent中设定该值为IntentAction,就直接能跳转到你自己的Intent接收者中。因为这个Action在系统中是唯一的。
2,data/type
,你可以用Uri来做为data,比如Uri uri = Uri.parse(http://www.google.com );
Intent i = new Intent(Intent.ACTION_VIEW,uri);
手机的Intent分发过程中,会根据http://www.google.com scheme判断出数据类型type
手机的Brower则能匹配它,在BrowerManifest.xml中的IntenFilter中首先有ACTION_VIEW Action,也能处理http:type

3
,至于分类Category,一般不要去在Intent中设置它,如果你写Intent的接收者,就在Manifest.xmlActivityIntentFilter中包含android.category.DEFAULT,这样所有不设置CategoryIntent.addCategory(String c);)的Intent都会与这个Category匹配。

4,extras
(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行发送电子邮件这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。

public class HelloActivity extends Activity { 
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // TODO Auto-generated method stub
  super.onCreateOptionsMenu(menu);
  menu.add(0, Menu.FIRST+1, 1, R.string.menu_open);
  menu.add(0, Menu.FIRST+2, 2, R.string.menu_edit);
  menu.add(0, Menu.FIRST+3, 3, R.string.menu_update);
  menu.add(0, Menu.FIRST+4, 4, R.string.menu_close);
  return true;
 }
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  // TODO Auto-generated method stub
  super.onOptionsItemSelected(item);
  switch(item.getItemId())
  {
  case Menu.FIRST + 1:
  {
   this.setTitle("Open Text!");
   Intent i = new Intent();   
   i.setAction("test_action");  
   if (Tools.isIntentAvailable(this,i))
    this.startActivity(i);
   else
    this.setTitle("the Intent is unavailable!!!");
   break;
  }
  case Menu.FIRST + 2:
  {
   this.setTitle("Edit Text!");
   break;
  }
  case Menu.FIRST + 3:
  {
   this.setTitle("Update Text!");
   break;
  }
  case Menu.FIRST + 4:
  {
   this.setTitle("Close Text!");
   break;
  }
  }
  return true;
 }
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);       
        this.setContentView(R.layout.main);   
    }
}

public class TestIntent extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
   TextView tv  = new TextView(this);
      tv.setText("Testing Intent here!");
      this.setContentView(tv);   
 }
}

 

 来看看TestIntent所在项目的Manifest.xml

<activity android:name="TestIntent" android:label="@string/hello"><intent-filter>
<action android:name="test_action"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
.....

 四.用Intent调用系统中经常被用到的组件

此常用组件部分来源于(http://kuikui.javaeye.com/blog/318627 

1 web浏览器

Uri uri = Uri. parse ( "http://kuikui.javaeye.com" );

returnIt =  new  Intent (Intent . ACTION_VIEW  uri );

2,地图

Uri mapUri = Uri. parse ( "geo:38.899533,-77.036476" );

returnIt =  new  Intent (Intent . ACTION_VIEW , mapUri);

3,调拨打电话界面

Uri telUri = Uri. parse ( "tel:100861" );

returnIt =  new  Intent (Intent . ACTION_DIAL , telUri);

4,直接拨打电话

Uri callUri = Uri. parse ( "tel:100861" );

returnIt =  new  Intent (Intent . ACTION_CALL , callUri);

5,卸载

Uri uninstallUri = Uri. fromParts ( "package"  " xxx "  null );

returnIt =  new  Intent (Intent . ACTION_DELETE , uninstallUri);

6,安装

Uri installUri = Uri. fromParts ( "package"  " xxx "  null );

returnIt =  new  Intent (Intent . ACTION_PACKAGE_ADDED , installUri);

7,播放

Uri playUri = Uri. parse ( "file:///sdcard/download/everything.mp3" );

returnIt =  new  Intent (Intent . ACTION_VIEW , playUri);

8,掉用发邮件

Uri emailUri = Uri. parse ( "mailto:shenrenkui@gmail.com" );

returnIt =  new  Intent (Intent . ACTION_SENDTO , emailUri);

9,发邮件

returnIt  =  new  Intent (Intent . ACTION_SEND );

String[] tos = {  "shenrenkui@gmail.com"  };

String[] ccs = {  "shenrenkui@gmail.com"  };

returnIt .putExtra(Intent . EXTRA_EMAIL , tos);

returnIt .putExtra(Intent . EXTRA_CC , ccs);

returnIt .putExtra(Intent . EXTRA_TEXT  "body" );

returnIt .putExtra(Intent . EXTRA_SUBJECT  "subject" );

returnIt .setType( "message/rfc882" );

Intent . createChooser ( returnIt  "Choose Email Client" );

10,发短信

Uri smsUri = Uri. parse ( "tel:100861" );

returnIt =  new  Intent (Intent . ACTION_VIEW , smsUri);

returnIt.putExtra( "sms_body"  "shenrenkui" );

returnIt.setType( "vnd.android -dir/mms-sms" );

11,直接发邮件

Uri smsToUri = Uri. parse ( "smsto://100861" );

returnIt =  new  Intent (Intent . ACTION_SENDTO , smsToUri);

returnIt.putExtra( "sms_body"  "shenrenkui" );

12,发彩信

Ur  mmsUri = Uri. parse ( "content://media/external/images/media/23" );

returnIt =  new  Intent (Intent . ACTION_SEND );

returnIt.putExtra( "sms_body"  "shenrenkui" );

returnIt.putExtra(Intent . EXTRA_STREAM , mmsUri);

returnIt.setType( "image/png" );



分享到:
评论

相关推荐

    android----intent

    在Android操作系统中,Intent是一种强大的组件间通信机制,它用于启动其他应用程序组件,如Activity、Service,甚至...深入学习Intent,包括其类型、用法、数据传递和Intent过滤器,将极大地提升Android开发能力。

    Android学习总结-Intent详解.doc

    Intent在Android开发中扮演着至关重要的角色,它是四大组件(Activity、Service、BroadcastReceiver和ContentProvider)间通信的关键。Intent不仅用于应用间的交互,也可以在同一个应用内的不同组件之间传递信息。...

    android intent and intent-filters

    在Android应用开发中,Intent是连接应用程序组件的重要机制,它是一种消息传递对象,用于启动其他组件(如Activity、Service、...同时,通过源码学习,可以更深入地了解Android系统的内部运作,提高问题排查能力。

    Android activity-alias别名的使用

    &lt;category android:name="android.intent.category.LAUNCHER" /&gt; &lt;/intent-filter&gt; &lt;/activity-alias&gt; ``` 在这个例子中,`.AliasActivity`是别名,`.RealActivity`是原始Activity。别名也需要像Activity一样设置...

    Android Intent Filter用法

    在Android应用开发中,Intent Filter是一个至关重要的...学习并熟练掌握Intent Filter的用法,对于开发高质量的Android应用至关重要。在实际项目中,可以根据需求调整Intent Filter,实现丰富的功能和良好的用户体验。

    Android-Intent-Action.zip_action _android

    在Android应用开发中,Intent是连接应用程序组件的重要机制,它用于在组件之间传递消息和启动操作。本资料主要聚焦于Android Intent...通过深入学习和实践,开发者可以更好地利用Intent来提升应用的交互性和用户体验。

    Android项目-谁是歌手

    【Android项目-谁是歌手】是一款专为初学者设计的猜歌应用,旨在帮助开发者学习和掌握Android项目开发。这个项目对于那些希望踏入Android开发领域的人来说,无疑是一个理想的起点,因为它不仅提供了实际的代码实现,...

    Android学习-broadcast实现音乐播放器

    在这个“Android学习-broadcast实现音乐播放器”的项目中,我们将探讨如何利用BroadcastReceiver来构建一个简单的音乐播放器。BroadcastReceiver是Android系统中的一个关键组件,它监听并响应系统或应用发布的广播...

    android-criminal-intent:android-criminal-intent 的教程应用程序

    Android-Criminal-Intent是专为学习和实践Android应用程序开发设计的一个教程项目。这个项目的核心在于理解和掌握Android的Intent机制,这是Android系统中用于组件间通信的关键概念。Intent不仅仅用于启动活动...

    Android代码-Android学习例子

    对于初学者,理解并掌握Android学习例子至关重要,因为它们能够提供实际操作经验,帮助快速上手这个平台。"Android代码-Android学习例子"这个主题涵盖了从基础到进阶的各种示例,旨在让菜鸟级别的开发者逐步深入...

    Android-Intent详解.doc编程资料

    Android-Intent详解.doc

    android----TxtReader

    总的来说,"android----TxtReader"项目涵盖了Android应用开发的多个关键领域,对于学习Android开发,尤其是对文本阅读器有兴趣的开发者来说,是一个极好的实践案例。通过研究这个项目,不仅可以提升Android编程技能...

    android-sdk-sources-android-21.rar

    - 首先,开发者应熟悉 Android 开发的基本概念,如 Activity 生命周期、Intent 机制等。 - 接着,通过阅读 `frameworks/base` 下的源码,了解系统服务如何与应用程序交互。 - 然后,研究 `system/core`,理解 ...

    android-support-v4-src源码

    《深入解析Android support-v4库源码》 在Android应用开发中,`android-support-v4`库是一个不可或缺的部分,它...对于任何想要提升Android开发技能的人来说,研究`android-support-v4`源码都是一个宝贵的学习机会。

    Android代码-山东建筑大学Android实验3--12.zip

    总的来说,这个压缩包提供了一个全面的学习平台,涵盖了Android开发的基本到高级主题,对于任何想要深入学习Android应用开发的人来说都是宝贵的资源。通过逐步完成这些实验,学生能够构建起坚实的Android开发基础。

    Android Intent 学习笔记

    Android Intent 学习笔记

    android-crop-master.zip

    4. **Intent数据传递**:裁剪后的图像需要通过Intent返回给调用者,涉及Android Intent的使用和数据传递。 5. **权限管理**:由于涉及到读取和写入文件以及使用相机,项目可能涉及Android的权限管理机制,如运行时...

    Android游戏 ---脑筋急转弯

    【Android游戏开发基础】 ...总的来说,"Android游戏 ---脑筋急转弯"是一个涵盖Android应用开发全生命周期的项目,涉及到UI设计、数据管理、逻辑控制、动画渲染等多个方面,是学习和实践Android游戏开发的好实例。

    android tabhost --android UI 学习

    这篇博客“android tabhost --android UI 学习”很可能深入探讨了如何使用TabHost来构建一个多页面的应用程序布局。在Android开发中,TabHost通常结合TabWidget和FrameLayout一起使用,前者负责显示和管理标签,后者...

Global site tag (gtag.js) - Google Analytics