核心基础小专题【Activity】
Android四大组件
- Activity
- BroadcastReceiver 广播接收者
- Service 服务
- ContentProvider 内容提供者
Activity的继承关系
public class Activity extends ContextThemeWrapper implements ....
public class ContextThemeWrapper extends ContextWrapper
public class ContextWrapper extends Context
public abstract class Context
Activity的编写步骤:
- 写一个类继承 Activity
- 重写onCreate()方法
-
在清单文件的下面声明activity 需要配置 布局文件 res/layout/...
需要设置布局文件 setContentView(R.layout.activity_main);
Activity相关
Activity生命周期
entire lifetime -->完整生命周期
onCreate() --> onStart() --> onResume() --> onPause() --> onStop() --> onDestroy()
visible lifetime -->可视化生命周期
onStart()-->onResume()-->onPause()-->onStop() --> onRestart();
foreground lifetime -->前台生命周期
onResume() --> onPause()
onRestart()调用过程
onStop() --> onRestart() --> onStart()
-
onCreate() 当activity被创建时调用的方法
-
onStart() 在onCreate()方法之后调用,当用户看到界面的时候调用
-
onResume() 在onStart()方法之后调用,当activity后去焦点的时候调用
-
onPause() 当activity失去焦点的时候调用 --> activity还能看见,但是对于activity里面的点击事件都无效了
-
onStop() 当activity界面不可见的时候调用
-
onDestroy() 当activity被销毁的时候调用
-
onRestart() 当用户按home键切换到桌面,然后再进入activity的时候 会调用
配置activity没有标题栏方法
-
配置application的theme <item name="windowNoTitle">true</item>
-
在自己写的activity的oncreate的方法里加入 requestWindowFeature(Window.FEATURE_NO_TITLE);
注意:这个方法要在setContentView之前调用,否则会报错
怎么创建一个activity界面
1.创建类继承Activity
2.在清单文件(AndroidManifest.xml)里面配置activity
3.实现类里的OnCreate的方法 -->这是Activity开启时调用的方法
4.在OnCreate方法里用 setContentView() -->指定activity显示的layout页面
怎么跳转一个Activity
直接开启
-
初始化显示意图,制定要跳转的Activity Intent intent = new Intent(上下文,myActivity.class);
或者:
Intent intent = new Intent();
intent.setClass(上下文,myActivity.class);
-
如果有参数,用intent携带参数 intent.putExtra(key,value); -->里面存放的格式有:数据基本类型,序列化对象,字节数组...
如果对象 实现了 Parcelable接口 或者 Serializable接口,也可以通过intent来传递
-
调用startActivity 来跳转新页面 上下文.startActivity(intent);
-
如果当前页面需要关闭,在当前页面调用finish方法 上下文.finish();
-
跳转过去的页面要获取数据调用intent的get...方法 注意:这里不能new一个intent,否则拿不到数据,要获跳转过来的intent,用getIntent来获取
Intent intent = getIntent();
intent.getXXXExtra();
利用startForResult来开启
- 初始化意图
- 如果有参数设置参数
-
调用startActivityForResult() 跳转页面 startActivityForResult(intent,requestCode);
-->requestCode:请求码,设置大于和等于0的数字
-
在跳转的activity里实现回跳的逻辑 Intent intent = new Intent();
intent.putXXX(); -->根据业务需求是否需要携带参数
setResult(resutlCode,intent);
finish(); -->最后需要关闭当前页面
-
当前activity实现onActivityResult()方法 --> 这是回跳的时候执行的方法 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
requestCode 是调用startActivityForResult时设置的requestCode
resultCode 是回跳的activity设置的code
data 是回跳时候携带的参数
可能当前页面需要跳转的页面过多,这里可以用requestCode和resultCode去过滤
显示意图&隐式意图
- 显示意图:必须指定打开的activity的类名或者路径名
应用场景-->适合自己应用程序内部使用,效率高
例子:
Intent intent = new Intent();
intent.setClassName(应用程序包名, 要跳转的activity路径名);
startActivity(intent);
- 隐示意图:需要指定action(动作)和category,如果action相同,而内容不同,可以配置data来区分
应用场景-->适合应用程序之间调用,根据action在去遍历查找,效率低
例子:
1.要跳转的activity在清单文件里增在intent-filter
<intent-filter >
<action android:name="自己定义,习惯用包名后加功能名"/>
<category android:name="android.intent.category.DEFAULT"/> //默认
</intent-filter>
2.谁要跳转到这个activity,谁的方法里面调用
Intent intent = new Intent();
intent.setAction("要跳转的activity在清单文件里配置的action");
intent.addCategory("android.intent.category.DEFAULT");-->默认
startActivity(intent);
隐示意图需要注意的地方
-
在清单文件的 intent-filter 里面还可以配置 data标签,data标签可以配置多个不同种类型的 例如:
<data android:scheme="自己定义"/> -->设置前缀,与电话播放器调用很像
<data android:mimeType="text/plain"/> -->定义类型,这里不能随意定义
-
在java代码里 如果配置了scheme和mineType:
intent.setDataAndType(scheme,mimeType);
如果只配置scheme:
intent.setData();
如果只配置了mimeType:
intent.setType();
利用隐示意图激活系统应用
- 分析系统应用的清单文件里面定义的intent-filter
- 在java代码里根据intent-filter去设置
-
调用startActivity去激活 例如:
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addCategory("android.intent.category.BROWSABLE");
intent.setData(Uri.parse("http://www.itheima.com"));
startActivity(intent);
通过textView还有一种方式跳转网页
tvName.setText(url);
tvName.setAutoLinkMask(Linkify.ALL); -->用来匹配是否是个url连接
tvName.setMovementMethod(LinkMovementMethod.getInstance());
-->这个方法要是不设置,不会去跳转
Activity横竖屏切换
- 在activity横竖屏切换的时候默认是销毁当前的activity,然后重新初始化activity
在清单文件里配置
android:screenOrientation="portrait"
portrait-->一直是竖屏
landspace --> 一直是横屏
固定activity的显示模式,这样就不会重走一次生命周期
或者配置
android:configChanges="keyboardHidden|screenSize|orientation"
这样的话就算横竖屏切换了,不会影响activity,也就不会重走一次生命周期
任务栈
task stack
- task --> 一个应用程序一般包括多个activity,每个activity都是用来和用户交互的任务
-
stack --> 栈是一种特殊的数据结构(后进先出),队列也是一种特殊的数据结构(先进先出) 任务栈就是记录用户的操作的,记录activity打开的先后顺序,后开的activity先关闭,
当栈里的activity全部关闭,应用就退出了
一个应用程序一般对应一个任务栈,在某种情况下也能对应多个栈
Activity启动模式
standard: 标准启动模式
特点:默认启动模式
singleTop:单一顶部模式
特点:如果activity已经被开启,而且是在栈顶,就不会在创建当前这个activity的实例,
而是复用这个已经开启的activity,但是如果不是在栈顶,就会初始化一个新的实例,
在整个栈里允许有多个实例
singleTask:单一任务栈
特点:当前栈里只允许有一个当前activity的实例,
如果要开启的activity在栈里存在,并且在底部,就会移除这个activity上面所有的activity
- 应用场景:如果这个activity非常消耗cpu和内存,建议把这个activity的启动模式设置为singleTask,浏览器的browserActivity 设置的就是
singleinstance:单一实例
特点:整个手机操作系统只有一个实例,并且是单独运行在自己的任务栈里
|