Android学习笔记——Intents 和 Intent Filters(一)

      本人邮箱:JohnTsai.Work@gmail.com,欢迎交流讨论。

      欢迎转载,转载请注明网址:http://www.cnblogs.com/JohnTsai/p/3991792.html

  • 知识点:Intents 和 Intent Filters的定义和作用以及用法。

   

  •  Intent
     Intent这个单词的意思是“意图”,正如它的意思,它在Android中就是表达了实现某项功能的意图(intention to do an  action)。

         定义

                Intent是传送消息的对象(messaging object),传送的是要求其他应用组件某些功能的消息。Intent的作用范围可以是

         同一Android应用内,也可以是不同应用间。例如我们经常使用的微信扫一扫功能就开启了系统拍摄照片的Activity。

                                                                 

              Intent是 android.content.Intent类型的对象,它可以通过Bundle携带数据。

           用途

                 1.开启activity (start an activity)     

                    

1  //启动方法:
2 
3             startActivity(Intent intent)
4 
5             startActivityForResult(Intent intent)

 

                 2.开启service(start a service)

               

1 // 启动方法:
2 
3                startService(Intent service)
4                bindService (Intent service, ServiceConnection conn, int flags)

 

                 3.释放broadcast(deliver a broadcast)

            

//启动方法
          sendBroadcast(Intent intent)
          sendBroadcast(Intent intent, String receiverPermission)

          sendOrderedBroadcast(Intent intent, String receiverPermission)
          sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
 
          sendStickyBroadcast(Intent intent)
          sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)

      

        类型

            Intent分为两种类型:显示Intent(Explicit intents )隐式Intent(Implicit intents)

            显示Intent:

                    指定通过名字(完全限定类名the fully-qualified class name)启动组件。一般在我们自己的app中使用明确的Intent来启动组件,因为我们知道自己的app中activity或service的类名。

           举个例子:

               作为对用户操作的反馈,开启一个新的activity或是开启了后台下载文件的service。

           隐式Intent:

                   没有要求具体的组件的类名字,取而代之的是声明了一个一般功能的Intent,其他应用的组件会处理。

 

 

              当我们创建一个显示Intent来开启一个activity或service时,系统会马上开启在Intent对象中详细说明的应用组件。

           

1 //显式Intent
2 Intent i=new Intent(MainActivity.this,SecondActivity.class);
3 startActivity(i); 

 

           当我们创建一个隐式Intent时,Android系统会通过intent的内容和在设备上其他app的声明在manifest file文件里的intent 过滤器(filters)比较,以寻找适当的组件来开启。如果intent匹配(match)intent filter,系统开启那个组件,传递intent对象。如果多个intent filters都匹配,系统会展示一个对话框让用户选择一个app使用。

     

//隐式Intent
Intent intent = new Intent();
intent.setAction("android.intent.action.DIAL");
//确保Intent会解决为Activity
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(sendIntent);
}

 

1 <!--Manifest文件中声明的intent filter-->
2 <activity
3            android:name="SecondActivity">
4             <intent-filter >
5                 <action android:name="android.intent.action.DIAL"/>
6                 <category android:name="android.intent.category.DEFAULT"/>
7             </intent-filter>
8   </activity>

 

 

                         

       

          1.Activity A创建了一个描述了功能的Intent,传递给了startActivity()

          2.Android系统在所有app的intent过滤器(intent filter)中寻找符合之前的intent的。

          3.当找到符合的时,系统开启符合的Activity(Activity B)通过调用它的onCreate()方法,传递Intent给它。

      

         

 

           如何更好的理解这两种Intent呢?

           《疯狂Android讲义》上有个例子可以帮助我们理解什么是显式Intent和隐式Intent,打个比方。就好比一个女生有找男朋友的意图,有两种方式表达她的意图。

            第一种,她明确指出,要找“吴彦祖”做男朋友,这种明确指定要找某人的方式就好比显式Intent。

            第二种,她指出要找高、富、帅做男朋友,至于到底是谁不重要,只要符合这三个条件即可,这种方式就好比隐式Intent。

        

 

              To be Continued.........

posted @ 2014-09-24 23:26  onerepublic  阅读(1434)  评论(0编辑  收藏  举报