Android之Intent详解和 横竖屏切换生命周期

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36252044/article/details/86682910

这章节主要介绍Intent的用法和Android横竖屏切换

Intent用法

1.定义

Intent 是一个消息传递对象,可以使用intent从其他应用组件请求操作.

2. 基本用例

(1)	启动Activity
	startActivity()
	startActivityForResult()
(2)	启动服务
	startService()
	bindService()
(3)	传递广播
	sendBroadcast()
	sendOrderBroadcast()
	sendStickyBroadcast()

3.Intent 类型

(1) 显式Intent 
	按名称(完全限定类名)指定要启动的组件.

(2) 隐式Intent
	不会指定特定的组件,而是声明要执行的Action,允许其他应用中的组件来处理Intent.

解释

(1) 创建显式Intent启动Activity或者服务时,系统会立即启动Intent对象中指定的应用组件.

(2) 创建隐式Intent时, Android系统通过将Intent的内容与在设备上其他应用的清单文件中声明的Intent过滤器比较,从而找到要启动的对应组件. 如果多个Intent过滤器兼容,则系统会显示一个对话框,提示用户选取应用.

	Activty如果需要隐式启动,那么在清单文件中需要声明Intent过滤器,标明启动的Action等一系列条件.

如图:

图解:
	a. A 创建包含描述的Intent,将Intent传给startActivity().
	b. Android系统搜索所有应用中与Intent匹配的Intent过滤器,(这里条件是只有一匹配),找到匹配后.
	c. 系统调用匹配B 的onCreate()方法并将Intent传入,然后启动匹配的Acitivty

注:

- 启动Service时, 始终使用显式Intent.因为无法确定哪些服务响应了Intent,用户也无法看到哪些服务被启动.
- 从Android 5.0(API 21)开始, 使用隐式Intent调用 bindService(),系统会引发异常.

4.显示Intent 示例

eg:

Intent xxxIntent = new (this,xxxService.class);
startService(xxxIntent);

##5. 隐式 Intent 示例##

注意

- 可能出现没有任何应用处理我们发送到startActivity()的Intent. 如果出现这种情况,则会调用失败导致应用崩溃.

- 我们在发出Intent 前,需要验证Acitivity是否会接受Intent, 使用Intent的resolveActivity()方法.如果结果不为空,至少有一个应用能处理Intent, 为空就不调用startActivity()

eg:

Intent sendIntent = new Intent();
if(sendIntent.resolveActivtiy(getPackageManager)!= null){
	starActivity(sendIntent);
}

6.强制使用应用选择器

场景:

如果多个应用响应隐式Intent,用户选择要使用的应用,并将其设为该操作的默认选项.
但是如果用户希望每次都是以不同的应用,那么就应该采用显示方式显示选择器对话框

eg:

 //强制启动应用选择器
 Uri uri = Uri.parse("https://www.baidu.com");
 Intent intent10 = new Intent(Intent.ACTION_VIEW, uri);
 String title = getResources().getString(R.string.chooser_title);
 Intent chooser = Intent.createChooser(intent10,title);
 if (intent10.resolveActivity(getPackageManager()) != null){
 	startActivity(chooser);
  }

效果图:

网易云怎么响应我这个Intent了...

7.接受隐式Intent

- 需要在清单文件中使用<intent-filter>元素为每个应用组件声明一个或者多个Intent过滤器
- 显示Intent始终会传递给目标,不论组件声明的Intent-filter如何过滤

在 内部,可以使用下列元素中的一个或者多个指定要接受的intent类型

在name属性中, 声明接受的intent的操作. 该值必须是操作的文本字符串值,而不是类常量.

使用一个或者多个指定数据URI各个方面(scheme,host,port,path等)和MIME类型的属性,声明接受的数据类型.

在name属性中,声明接受的intent的操作. 该值必须是操作的文本字符串值,而不是类常量.

eg:

当数据为文本类型时,系统将接受ACTION_SEND Intent

<activity android:name="ShareActivity">
<intent-filter>
    <action android:name="android.intent.action.SEND"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="text/plain"/>
</intent-filter>
</activity>

8.限制对组件的访问

场景###

即使设置了intent过滤器,但是如果知道我们应用中的确切包名,还是可以用显式intent启动,所以为了确保自己的应用才能启动app的某一个组件.

应该将该组件的 exported 属性设置为 false

9.PendingIntent

定义

PendingIntent 对象是Intent对象的包装器. 它不是立刻执行某个行为,而是满足某些条件或者触发某些事件后才执行指定的行为.

主要作用:

- 声明用户使用您的通知执行操作时所要执行的 Intent(Android 系统的 NotificationManager 执行 Intent)。
- 声明用户使用您的 应用小部件执行操作时要执行的 Intent(主屏幕应用执行 Intent)。
- 声明未来某一特定时间要执行的 Intent(Android 系统的 AlarmManager 执行 Intent)。

声明需要的组件类型

- PendingIntent.getActivity(),适用于启动 Activity 的 Intent。
- PendingIntent.getService(),适用于启动 Service 的 Intent。
- PendingIntent.getBroadcast(),适用于启动 BroadcastReceiver 的 Intent。

横竖屏切换

Activity横屏切换竖屏生命周期

Android 8.0设备

1.Activtiy启动

onCreate
onStart
onResume

2.切换到横屏时

onPause
onSaveInstanceState
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume

3.再切换回竖屏

onPause
onSaveInstanceState
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
  1. 清单文件中 android:configChanges=“orientation” 再执行步骤2

     onConfigurationChanged 
    
  2. 然后再执行步骤3

     onConfigurationChanged
    

PS:
8.0 以下的系统在仅设置 “orientation” 的情况下,会先调用onConfigurationChanged,然后再走一遍生命周期方法

属性:

- 获取屏幕状态
(int ORIENTATION_PORTRAIT = 1;  竖屏    int ORIENTATION_LANDSCAPE = 2; 横屏)
int screenNum = getResources().getConfiguration().orientation;

- configChanges属性
1.orientation 屏幕在纵向和横向间旋转 
2.keyboardHidden 键盘显示或隐藏 
3.screenSize 屏幕大小改变了 
4.fontScale 用户变更了首选的字体大小 
5.locale 用户选择了不同的语言设定 
6.keyboard 键盘类型变更,例如手机从12键盘切换到全键盘 
7.touchscreen或navigation 键盘或导航方式变化,一般不会发生这样的事件
常用的包括:orientation|keyboardHidden| screenSize,设置这三项界面不会走Activity的生命周期,只会回调onConfigurationChanged方法。

screenOrientation属性
1.unspecified 默认值,由系统判断状态自动切换 
2.landscape 横屏 
3.portrait 竖屏 
4.user 用户当前设置的orientation值 
5.behind 下一个要显示的Activity的orientation值 
6.sensor 使用传感器 传感器的方向 
7.nosensor 不使用传感器 基本等同于unspecified仅landscape和portrait常用,代表界面默认是横屏或者竖屏,还可以再代码中更改。

猜你喜欢

转载自blog.csdn.net/qq_36252044/article/details/86682910
今日推荐