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的编写步骤:
1.写一个类继承 Activity
2.重写onCreate()方法
3.在清单文件的下面声明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
直接开启
1.初始化显示意图,制定要跳转的Activity
Intent intent = new Intent(上下文,myActivity.class);
或者:
Intent intent = new Intent();
intent.setClass(上下文,myActivity.class);
2.如果有参数,用intent携带参数
intent.putExtra(key,value); -->里面存放的格式有:数据基本类型,序列化对象,字节数组...
如果对象 实现了 Parcelable接口 或者 Serializable接口,也可以通过intent来传递
3.调用startActivity 来跳转新页面
上下文.startActivity(intent);
4.如果当前页面需要关闭,在当前页面调用finish方法
上下文.finish();
5.跳转过去的页面要获取数据调用intent的get...方法
注意:这里不能new一个intent,否则拿不到数据,要获跳转过来的intent,用getIntent来获取
Intent intent = getIntent();
intent.getXXXExtra();
利用startForResult来开启
1.初始化意图
2.如果有参数设置参数
3.调用startActivityForResult() 跳转页面
startActivityForResult(intent,requestCode);
-->requestCode:请求码,设置大于和等于0的数字
4.在跳转的activity里实现回跳的逻辑
Intent intent = new Intent();
intent.putXXX(); -->根据业务需求是否需要携带参数
setResult(resutlCode,intent);
finish(); -->最后需要关闭当前页面
5.当前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();
利用隐示意图激活系统应用
1.分析系统应用的清单文件里面定义的intent-filter
2.在java代码里根据intent-filter去设置
3.调用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:单一实例
特点:整个手机操作系统只有一个实例,并且是单独运行在自己的任务栈里
•应用场景:通话界面的activity
•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的编写步骤:
1.写一个类继承 Activity
2.重写onCreate()方法
3.在清单文件的下面声明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
直接开启
1.初始化显示意图,制定要跳转的Activity
Intent intent = new Intent(上下文,myActivity.class);
或者:
Intent intent = new Intent();
intent.setClass(上下文,myActivity.class);
2.如果有参数,用intent携带参数
intent.putExtra(key,value); -->里面存放的格式有:数据基本类型,序列化对象,字节数组...
如果对象 实现了 Parcelable接口 或者 Serializable接口,也可以通过intent来传递
3.调用startActivity 来跳转新页面
上下文.startActivity(intent);
4.如果当前页面需要关闭,在当前页面调用finish方法
上下文.finish();
5.跳转过去的页面要获取数据调用intent的get...方法
注意:这里不能new一个intent,否则拿不到数据,要获跳转过来的intent,用getIntent来获取
Intent intent = getIntent();
intent.getXXXExtra();
利用startForResult来开启
1.初始化意图
2.如果有参数设置参数
3.调用startActivityForResult() 跳转页面
startActivityForResult(intent,requestCode);
-->requestCode:请求码,设置大于和等于0的数字
4.在跳转的activity里实现回跳的逻辑
Intent intent = new Intent();
intent.putXXX(); -->根据业务需求是否需要携带参数
setResult(resutlCode,intent);
finish(); -->最后需要关闭当前页面
5.当前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();
利用隐示意图激活系统应用
1.分析系统应用的清单文件里面定义的intent-filter
2.在java代码里根据intent-filter去设置
3.调用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:单一实例
特点:整个手机操作系统只有一个实例,并且是单独运行在自己的任务栈里
•应用场景:通话界面的activity