目录
前言
一、显式调用与隐式调用区别
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
(1)通过如下方式调用:
Intent intent =new Intent(this,MainActivity.class); startActivity(intent);
(2)明确指明调用组件,应用程序内部Activity跳转
(3)效率高,但耦合度也高
(1)通过在androidMafest.xml中配置IntentFilter,与intent 进行匹配调用符合条件的Activity
(2)不明确指出目标组件名称,用于不同应用程序之间,由系统查找符合条件的Activity进行调用,如在本应用内调用 拨号界面
(3)降低程序耦合度,但是效率低
//1、构造方法传入Component
Intent intent =new Intent(this,SecondActivity.class);
startActivity(intent);
//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方法
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);
(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
匹配规则:Intent中的action必须存在,且与IntentFilter的 任一action 字符串值相同
匹配规则:intent可不设置category ,因为系统在调用 startActivity 或者 startActivityForResult 时会默认intent 加上 ''android.intent.category.DEFAULT''这个category ,同时为了Activity可以接收隐式调用,就必须在Intent Filter中指定 ''android.intent.category.DEFAULT''这个category
如果intent有category ,不管有几个category,对于每个category,都必须是过滤信息中已经定义过了的category
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
//设置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);
APP:test 和 test2
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);
}
});
}
}
AndroidMainfest.xml文件
Android隐式调用演示demo视频
与大家交流学习,同时若有不足之处请大家指出,互相学习,感谢至极