• 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

  • 相关阅读:
    Socket原理与编程基础
    Hello cnblogs
    c# List 分页问题
    chrome下载Word失败问题
    前端时间Date显示问题踩坑
    Vue跳转同一界面多次,使用不同数据进行渲染
    Hadoop在Linux环境下的配置
    RabbitMQ下载安装
    Codeforces 527 C. Glass Carving
    python压缩、解压文件
  • 原文地址:https://www.cnblogs.com/xuyinghui/p/4959849.html
Copyright © 2020-2023  润新知