Android--显式调用与隐式调用及两者区别

目录

前言

一、显式调用与隐式调用区别

1.显式调用:

2.隐式调用:

二、Android显式调用

从MainActivity跳转到SecondActivity

1.构造方法传入Component(最常用)

2.setClass/setClassName方法

3.setComponent方法

 三、 Android隐式调用

1.action匹配: Intent的action  <--> 过滤信息中的任一action

2.category匹配:Intent的category <--> 过滤信息中的category

3.data匹配:

四、设置Intent的 action + category + data   

 五、制作demo实践(test和test2)

(1)test

 (2)test2

 (3)效果视频

前言

Android官方文档:intent 

Android--显式调用与隐式调用及两者区别_第1张图片

一、显式调用与隐式调用区别

1.显式调用:

(1)通过如下方式调用:

Intent  intent =new Intent(this,MainActivity.class);
startActivity(intent); 

(2)明确指明调用组件,应用程序内部Activity跳转

(3)效率高,但耦合度也高

2.隐式调用:

(1)通过在androidMafest.xml中配置IntentFilter,与intent 进行匹配调用符合条件的Activity

(2)不明确指出目标组件名称,用于不同应用程序之间,由系统查找符合条件的Activity进行调用,如在本应用内调用 拨号界面 

(3)降低程序耦合度,但是效率低

二、Android显式调用

从MainActivity跳转到SecondActivity

1.构造方法传入Component(最常用)

    //1、构造方法传入Component
    Intent  intent =new Intent(this,SecondActivity.class);
    startActivity(intent);

2.setClass/setClassName方法

    //2、setClass/setClassName 方法 
    //其中 this 可替换成 this.getPackageName()  
    //SecondActivity.class  可替换成 “com/hx/test/SecondActivity” 
    Intent intent=new Intent();
    intent.setClass(this,SecondActivity.class);
    startActivity(intent);
    

3.setComponent方法

    //3、setComponent方法
    ComponentName componentName=new ComponentName(this,SecondActivity.class);
    //其中 this 可替换成 this.getPackageName()  
    //SecondActivity.class  可替换成 “com/hx/test/SecondActivity”
    Intent intent=new Intent();
    intent.setComponent(componentName);
    startActivity(intent);

 三、 Android隐式调用

(1)了解一个结构: IntentFilter 设置的过滤信息 = action + category + data 

                              Intent可设置 action + category + data   

(2)只有 这两部分中的同类别 分别对应匹配成功 才能启动Activity

一个Intent  的 action + category + data 《---》 IntentFilter 的 action + category + data   

(3)start Activity(intent) 后 当系统内有一个Activity的Intent Filter中的过滤信息与此Intent匹配上

则启动此Activity (在系统内查找能与此intent匹配的Activity并启动它)

(4)一个Activity中可以有多个IntentFilter 一个intent只要能匹配任何一组IntentFilter即可成功启动对应的Activity

1.action匹配: Intent的action  <--> 过滤信息中的任一action

匹配规则:Intent中的action必须存在,且与IntentFilter的 任一action 字符串值相同

2.category匹配:Intent的category <--> 过滤信息中的category

匹配规则:intent可不设置category ,因为系统在调用 startActivity 或者 startActivityForResult  时会默认intent 加上 ''android.intent.category.DEFAULT''这个category ,同时为了Activity可以接收隐式调用,就必须在Intent Filter中指定 ''android.intent.category.DEFAULT''这个category

如果intent有category ,不管有几个category,对于每个category,都必须是过滤信息中已经定义过了的category

3.data匹配:

data结构 :mimeType  +  URI

(1)mimeType 指媒体类型 比如image/jpeg/video等 可以表示图片、文本、视频等不同媒体格式

(2)URI:

://:/[||]

scheme:URI的模式,比如http、file、content等(不指定scheme则URI是无效的)

host:URI的主机名,比如 www.baidu.com (不指定host则URI是无效的)

port:URI的端口号,比如 80(仅当URI指定了scheme和host 时port才是有意义的)

path、pathPrefix、pathPattern:表示路径信息,其中path表示路径完整信息;pathPattern表示完整路径信息,但里面可包含通配符 '' * '' ,表示0个或多个任意字符,pathPrefix表示路径前缀信息

匹配规则:intent必须要有data,且data数据能够完全匹配过滤规则的某一个data(这里的完全匹配是指 过滤规则中出现的data部分也出现在了intent中的data中)

URI有默认值:content/file

四、设置Intent的 action + category + data   

    //设置action     
    Intent  intent =new Intent("com.ryg.ch.c");
    //设置category
    intent.addCategory("com.ryg.category.c");
    //设置data
    intent.setDataAndType(Uri.parse("file://abc"),"text/plain");
    startActivity(intent);

 五、制作demo实践(test和test2)

APP:test 和 test2

(1)test

AndroidMainfest.xml文件




    
        
        
            
                

                
            
        
    

 MainActivity(UI界面定义两个按钮从test:button跳转至test2,button2 跳转至拨号界面)

package com.hx.test;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.KeyEventDispatcher;

import android.content.ComponentName;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               //隐式调用
               Intent  intent =new Intent("com.ryg.ch.c");
               intent.addCategory("com.ryg.category.c");
               // intent.setDataAndType(Uri.parse("file://abc"),"text/plain");
               startActivity(intent);

           }
       });
        findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //隐式调用
                Intent intent1=new Intent(Intent.ACTION_DIAL);
                intent1.setData(Uri.parse("tel:10086"));
                startActivity(intent1);
            }
        });
    }
}

 (2)test2

AndroidMainfest.xml文件




    
        
            
                

                
                
            
        
    

 (3)效果视频

Android隐式调用演示demo视频

 与大家交流学习,同时若有不足之处请大家指出,互相学习,感谢至极

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