窗口跳转
6.1、显式跳转
切换方式:按钮点击
事件处理,一般在oncreate()函数中定义
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ly_view);
Log.i("mytag","oncreate");
//1.根据资源编号获取该资源对应的对象的引用(确认事件源)
findViewById(R.id.btn_gogo).setOnClickListener(
//2.调用相应的侦听注册函数
new View.OnClickListener() {
@Override
//3.创建侦听器对象,并实现回调函数
public void onClick(View view) {
//Intent实现窗口跳转(显式调用)
//Intent是负责在安卓四大组件之间传递信息(桥梁)
//当前所在Activity的this指针,目标窗口的类对象
//start执行跳转功能
startActivity(new Intent(AMain.this,Act1.class));
}
}
);
}
测试:
当主页面打开时
主页面的三个回调函数被调用
当点击跳转按钮后
主函数的pause函数调用,先暂停当前主页面的活动
在调用启动副页面的三个回调函数
之后在执行主页面的停止函数
当关闭副页面时,先暂停副页面的活动
启动主页面restart回调函数,在主页面进入到与用户交互状态时在停止本页面的服务,并销毁
6.2、隐式跳转
设置隐式跳转按钮功能
public class AMain extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
//找到对应按钮的id
findViewById(R.id.btn_implicit).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent("myaction", Uri.parse("mosang://implicit.check")));
//intent函数有两个参数(action,uri)
//这两个参数分别对应了在清单文件中自定义的目的页面的action与uri
//根据intent对象提供的信息,寻找具有相应的action,dada的activity
//由于没有给出具体页面的地址,所以称为隐式跳转
}
});
}
}
Uri:<scheme>://<host>:<port>[<path>|<pathPrefix>|<pathPattern>]
在清单文件中注册
<activity android:name=".implicit_check" android:exported="true">
<!--export=true 允许其他app匹配当前app-->
<intent-filter>
<action android:name="myaction"/>
<!--这里的action标签内容自定义-->
<category android:name="android.intent.category.DEFAULT"/>
<!--凡是预定义的category都会有一个默认的default-->
<data android:scheme="mosang"
android:host="implicit.check"/>
<!--在data标签中配置Url
scheme:协议名 host:主机名
在目的页面设置 -->
</intent-filter>
</activity>
注:
-
在包装时
filter
中只能有一个action标签,但可以存在多个catagory标签 -
intent对象在寻找匹配时,给定的Intent对象的Uri参数只要与清单文件中多个catagory标签中的一个匹配即可实现跳转
-
可以在函数中通过intent对象添加catalogy:
it.addCategory("111");
6.3、预定义action
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EditText text1=(EditText)findViewById(R.id.phone_text);
//通过findViewById函数获取EditText对象,将其强转为EditText对象即可获取其值
findViewById(R.id.btn_action).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+text1.getText().toString())));
//通过text1.getText().toString()拿到内容字符串
}
});
}
总结:
Intent对象的用途:
-
启动Activity:
Activity
表示应用中的一个屏幕。通过将Intent
传递给startActivity()
,您可以启动新的Activity
实例。Intent
用于描述要启动的 Activity,并携带任何必要的数据。 -
启动Service:
Service
是一个不使用用户界面而在后台执行操作的组件。使用 Android 5.0(API 级别 21)及更高版本,您可以启动包含JobScheduler
的服务。如需了解有关JobScheduler
的详细信息,请参阅其API-reference documentation
。 -
发送广播:广播是任何应用均可接收的消息。系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播。通过将
Intent
传递给sendBroadcast()
或sendOrderedBroadcast()
,您可以将广播传递给其他应用。
Intent对象的两种类型
-
explicit(显式)
通过提供目标应用的软件包名称或完全限定的组件类名来指定可处理 Intent 的应用。通常,您会在自己的应用中使用显式 Intent 来启动组件,这是因为您知道要启动的 Activity 或服务的类名。例如,您可能会启动您应用内的新 Activity 以响应用户操作,或者启动服务以在后台下载文件。
-
implict(隐式)
不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理。例如,如需在地图上向用户显示位置,则可以使用隐式 Intent,请求另一具有此功能的应用在地图上显示指定的位置。
antion的匹配规则
action是一个字符串,如果Intent指明定了action,则目标组件的Intent-Filter的action列表中就必须包含有这个action,否则不能匹配。一个Intent Filter中可声明多个action,Intent中的action与其中的任一个action在字符串形式上完全相同(注意,区分大小写,大小写不同但字符串内容相同也会造成匹配失败),action方面就匹配成功。可通过setAction方法为Intent设置action,也可在构造Intent时传入action。需要注意的是,隐式Intent必须指定action
Intent对象的组成
Intent由6部分信息组成:
Component Name,Action,Data,Catagory,Extras,Flags
根据信息的作用用于,又可分为三类:
-
Component Name、Action、Data、Category为一类
这4类中信息决定了Android会启动哪个组件,其中Component Name用于在显式Intent中使用,Action、Data、Category、Extras、Flags用于在隐式Intent中使用。
-
Extras为一类,里面包含了具体的用于组件实际处理的数据信息。
-
Flags为一类,其是Intent的元数据,决定了Android对其操作的一些行为。
Component_name
要启动的组件的名称。 如果你想使用显式的Intent,那么你就必须指定该参数,一旦设置了component name,Android会直接将Intent传递给组件名所指定的组件去启动它。如果没有设置component name,那么该Intent就是隐式的,Android系统会根据其他的Intent的信息(做一些比较判断决定最终要启动哪个组件。所以,如果你启动一个你自己App中的组件,你应该通过指定component name通过显式Intent去启动它(因为你知道该组件的完整类名)。
当启动Service的时候,你应该总是指定Component Name。否则,你不确定最终哪个App的哪个组件被启动了,并且用户也看不到哪个Service启动了。
Action
指定要执行的通用操作(例如,查看或选取)的字符串。
Android系统预定义了许多action,这些action代表了一些常见的操作。
通过Intent 将此操作与 startActivity()
结合使用。
Intent.ACTION_VIEW Intent.ACTION_DIAL Intent.ACTION_SENDTO Intent.ACTION_SEND Intent.ACTION_WEB_SEARCH
官方文档:
Data
Uri对象和数据的MIME类型,其对应着Intent Filter中的data标签。
一个完整的Uri由scheme、host、port、path组成
格式是scheme://host:port/pathUri
Uri就像一个数据链接,组件可以根据此Uri获得最终的数据来源。
Category
包含了关于组件如何处理Intent的一些其他信息,虽然可以在Intent中加入任意数量的category,但是大多数的Intent其实不需要category。
Extras
额外的数据信息,Intent中有一个Bundle对象存储着各种键值对,接收该Intent的组件可以从中读取出所需要的信息以便完成相应的工作。有的Intent需要靠Uri携带数据,有的Intent是靠extras携带数据信息。
可以通过调用Intent对象的各种重载的putExtra(key, value)方法向Intent中加入各种键值对形式的额外数据。
也可以直接创建一个Bundle对象,向该Bundle对象传入很多键值对,然后通过调用Intent对象的putExtras(Bundle)方法将其一块设置给Intent对象中去。
Flags
Flag在 Intent
类中定义,充当 Intent 的元数据。标志可以指示 Android 系统如何启动 Activity(例如,Activity 应属于哪个任务,以及启动之后如何处理(例如,Activity 是否属于最近的 Activity 列表)。
6.4、间接跳转
主页面路径设置:
findViewById(R.id.btn_indirect).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent("Indirect_Action",Uri.parse("mosang://indirect.check/redirect")));
}
});
二级页面进行目录的判断:(indirect_check)
//判断如果子路径匹配
//则设置新的跳转页面
if(getIntent().getData().getPath().equals("/redirect")){
//Intent it=new Intent();
//it.setClass(this,aim_act.class);
//setclass与显式匹配的构造函数有相同的作用
//startActivity(it);
startActivity(new Intent(this,aim_act.class));
//间接跳转会创建一个新界面act3,而原界面act2不会销毁
//当目的界面act3关闭时,会返回到上一级界面act2
finish();
//在跳转完成后,自动销毁当前页面
}
}