任务和回退栈
- 任务:任务是指执行特定作业时与用户交互的一系列Activity,也遵循先进后出原则!
堆栈中的Activity永远不会重新排列,开启Activity会进入任务中,点击返回按钮会弹出任务 - 回退栈:任务会一次的进入回退栈中,也遵循先进后出!
- Activity启动模式(4s)
- 设置启动模式
- 在清单文件中,给指定的Activity设置启动模式,android:launchMode
- standard,每次启动Activity都会新创建一个实例,进入任务栈中,遵循后进先出原则!
- singleTop,顶部单一模式,如果设置此模式的Activity在栈顶,再次调用此Activity,不会重新创建一个新的Activity!如果不是处于栈顶,那么它和标准模式一样,每次会重新创建!
- singleTask,任务栈内单一模式!如果设置此模式的Activity在任务中存在!再次调用的时候,会复用此Activity,并且遵循堆栈中的Activity永远不会重新排列,所以,它会清空它的顶部的所有Activity!
- singleInstance,设置此模式的Activity,会单独存在一个任务栈中,如果再次调用,会复用原来创建的任务栈!并且,任务栈也遵循后进先出原则!
- 可以在Java代码中,Intent跳转的时候,动态设置启动模式!intent.setFlags()
- 在清单文件中,给指定的Activity设置启动模式,android:launchMode
- 设置启动模式
- 启动模式在开发中的作用:Activity复用,节省内存!提高程序性能!避免!用户多次点击返回按钮无法推出程序!
- 思考:什么情况下Activity会进行复用?
- singleTop,该模式下当前Activity处于栈顶,再次调用会进行复用
- singleTask,当前Activity已经创建过,再次创建的时候会复用,通过清空该Activity上部所有Activity让该Activity处于栈顶达到复用效果!
- singleInstance,当前Activity已经创建过,再次调用会进行复用
- onNewIntent(Intent intent)
- 可以通过重写此方法,进行Activity的刷新工作!因此
此方法只有在Activity发生复用的时候才会调用!具体复用就是以上三种情况!
- 可以通过重写此方法,进行Activity的刷新工作!因此
- 清单文件中和Java代码中设置启动模式的区别
- 清单文件中可以设置四种启动模式!而Java代码中只能设置三种启动模式
- 清单文件中一旦设置启动模式,那么该Activity的启动模式就固定了!但是Java代码中可以给一Activity在不同跳转的情况下设置不同的启动模式,启动模式并不固定!
- 如果在清单文件中设置了启动模式,又在Java代码中设置了启动模式,那么以Java代码中的设置为准!
- 代码中设置:
- Intent setFlags()
- FLAG_ACTIVITY_SINGLE_TOP:就是启动的SingleTop
- FLAG_ACTIVITY_SINGLE_TOP|FLAG_ACTIVITY_CLEAR_TOP:就是启动的SingleTask
- 不添加:就是默认standard模式
- 作用范围:仅限于本页面跳转!
- Intent setFlags()
Intent页面跳转
- Intent分类
- 显式意图
- Intent的一个属性ComponentName(组件名)
- 显式意图的底层全部是封装ComponentName进行跳转!
- 1.
Intent intent = new Intent(当前组件.this,目标组件.class);
- 2.
Intent intent = new Intent(); intent.setClass(当前组件.this,目标组件.class);
- 3.
Intent intent = new Intent();
ComponentName name = new ComponentName(当前组件.this,目标组件.class);
- 1.
- ComponentName
- 它是Intent七大属性之一!用来组件间的跳转!它会形成显式意图!
- 它可以进行跨程序页面跳转!
- 目标程序已经在手机运行过
- 知道目标程序的包名和Activity的全路径
- 用法
Intent intent = new Intent();
ComponentName cName = new ComponentName(1,2);
intent.setComponent(cName);
startActivity(intent);
- 隐式意图
-利用动作显式你要做的事,给定一些目标的参数!根据参数去匹配具体的组件!
- 明确1:
- 如果清单文件中的Activity没有intent-filter!那么想要打开此Activity只能使用显式意图!
- 明确2:
- 如果清单文件中的Activity有intent-filtet标签,那么想要打开此Activity可以选择显式意图或者隐式意图
- 明确3:
- 隐式意图匹配的过程,就是Intent和清单文件中的intent-filter进行匹配的过程!你发出的Intent匹配的手机所有包含intent-filter的组件!
- 明确4:
- 隐式意图匹配成功!Intent中包含的Action和Category还有Data type和intent-filter中包含的action和category和data还有type完全相符合,即匹配成功!
- 明确1:
- 显式意图
URI
- URI 统一资源标识符!
- scheme:协议
- host:主机名
- port:端口号
- path:路径
- URL 统一资源定位符!
- URI 统一资源标识符!
Intent的7大属性
- ComponentName,组件间跳转,可以是本程序,也可以是其他程序(手机中运行过);显式意图
- Extra,Intent携带的数据,intent.putExtra(key,value)
- Flags,Java代码设置启动默认是,此方法设置启动模式有三种,默认、SingleTop、SingleTask
- Action
- Category
- Data
- Type
最后这四种属性,都是隐式意图的一部分!在Intent和Intent-filter进行匹配的过程中,这四种属性都是需要考虑的因素!
- 利用隐式意图打开系统相关的Activity
- 打电话(需要权限)
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:18514592456"));- 设置权限
<uses-permission android:name="android.permission.CALL_PHONE"/>
- 拨号页面
intent.setAction(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:18514592456"));
- 发短信
intent.setAction(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("smsto:111"));
intent.putExtra("sms_body","i have nothing to say");
- 设置页面
- Action:Settings(android.provider包下的)
- 打开设置WiFiu页面
intent.setAction(Settings.ACTION_WIFI_SETTINGS);
- 打开总设置页面
intent.setAction(Settings.ACTION_SETTINGS);
- 打开设置WiFiu页面
- Action:Settings(android.provider包下的)
- 照相机(需要权限)
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
- 设置权限
<uses-permission android:name="android.permission.CAMERA"/>
- 打开本地文件
- intent.setAction(Intent.ACTION_VIEW);
- intent.setDataAndType(Uri data , String type)
- data
- 打电话(需要权限)