博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android四大组件之Activity
阅读量:5879 次
发布时间:2019-06-19

本文共 5735 字,大约阅读时间需要 19 分钟。

Acitivity做为Android四大组件之首,在Android app开发过程中尤为重要,这里我们对Activity的生命周期启动模式 Flags 异常退出的状态保存状态恢复显式启动隐式启动以及Activity的隐式启动action category data的过滤规则整理总结。

Activity的生命周期

activity_life_cycle.png

分别覆写Activity生命周期中几个重要的方法:

protected void onCreate(Bundle savedInstanceState) {        Log.i("target","Activity onCreate");    }    protected void onStart() {        Log.i("target","Activity onStart");    }    protected void onRestart() {        Log.i("target","Activity onRestart");    }    protected void onResume() {        Log.i("target","Activity onResume");    }    protected void onPause() {        Log.i("target","Activity onPause");    }    protected void onStop() {        Log.i("target","Activity onStop");    }    protected void onDestroy() {        Log.i("target","Activity onDestroy");    }
不同情境下生命周期方法执行顺序

正常情况下生命周期

从进入activity到按下回退键退出activity

com.example.root.activitylifecycle I/target: Activity onCreatecom.example.root.activitylifecycle I/target: Activity onStartcom.example.root.activitylifecycle I/target: Activity onResumecom.example.root.activitylifecycle I/target: Activity onPausecom.example.root.activitylifecycle I/target: Activity onStopcom.example.root.activitylifecycle I/target: Activity onDestroy

屏幕灭掉

com.example.root.activitylifecycle I/target: Activity onCreatecom.example.root.activitylifecycle I/target: Activity onStartcom.example.root.activitylifecycle I/target: Activity onResumecom.example.root.activitylifecycle I/target: Activity onPausecom.example.root.activitylifecycle I/target: Activity onStop

可以看到并没有执行onDestroy方法,接下来点亮屏幕

com.example.root.activitylifecycle I/target: Activity onRestartcom.example.root.activitylifecycle I/target: Activity onStartcom.example.root.activitylifecycle I/target: Activity onResume

跳转到其他activity

com.example.root.activitylifecycle I/target: Activity onCreatecom.example.root.activitylifecycle I/target: Activity onStartcom.example.root.activitylifecycle I/target: Activity onResumecom.example.root.activitylifecycle I/target: Activity onPausecom.example.root.activitylifecycle I/target: SecondActivity onCreatecom.example.root.activitylifecycle I/target: SecondActivity onStartcom.example.root.activitylifecycle I/target: SecondActivity onResumecom.example.root.activitylifecycle I/target: Activity onStop

注意:当第二个activity执行到onResume方法后第一个activity才执行onStop方法,即当第二个activity就绪之后第一个activity才执行onStop方法,但第一个activity并没有执行onDestroy方法,它被放入后退栈中。

接下来按下退格键返回第一个activity

com.example.root.activitylifecycle I/target: SecondActivity onPausecom.example.root.activitylifecycle I/target: Activity onRestartcom.example.root.activitylifecycle I/target: Activity onStartcom.example.root.activitylifecycle I/target: Activity onResumecom.example.root.activitylifecycle I/target: SecondActivity onStopcom.example.root.activitylifecycle I/target: SecondActivity onDestroy

第二个activity的生命周期执行完成,第一个activity执行onRestartonResume重新就绪,再次按下退格键

com.example.root.activitylifecycle I/target: Activity onPausecom.example.root.activitylifecycle I/target: SecondActivity onStopcom.example.root.activitylifecycle I/target: SecondActivity onDestroy

第一个activity生命周期执行结束

Activity异常时数据保存于数据恢复

当屏幕旋转的时候activity就会重新执行onCreate,我们可以用屏幕旋转模拟activity异常销毁

protected void onSaveInstanceState(Bundle outState) {        Log.i("target","Activity onSaveInstanceState");        outState.putString("target","this is onSaveInstanceState saved bundle data");    }    protected void onRestoreInstanceState(Bundle savedInstanceState) {        Log.i("target","Activity onRestoreInstanceState");        Log.i("target",savedInstanceState.getString("target"));    }

日志信息

com.example.root.activitylifecycle I/target: Activity onSaveInstanceStatecom.example.root.activitylifecycle I/target: Activity onRestoreInstanceStatecom.example.root.activitylifecycle I/target: this is onSaveInstanceState saved bundle data
Activity的LaunchMode
  • standard模式:这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中,使用场景(大多数Activity)

  • singleTop模式:如果任务栈的栈顶正好存在该Activity的实例,就重用该实例(会调用实例的onNewIntent()),否则就会创建新的实例并放入栈顶,计时栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例,使用场景(新闻类或者阅读类App的内容页面)

  • singleTask模式:如果栈中已经有该Activity的实例,就重写该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在他上面的实例将会被移出栈,如果栈中不存在该实例,将创建新的实例放入栈中,使用场景如浏览器的主界面,不管从多少个应用启动浏览器,只会启动主界面一次,其余都会走onNewIntent,并清空主界面上的其他页面

  • singleInstance模式:在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该activity实例,一旦该模式的activity实例已经存在于某个栈中,任何英语再激活该activity时都会重用该栈中的实例,会调用(onNewIntent()),其效果相当于多个应用共享一个应用,不管谁激活该activity都会进入同一个应用中,使用场景(闹铃提示,将闹钟提醒与闹钟设置分离),singleinstance不要勇于中间页面,如果用于中间页面,跳转会有问题(A->B->(singleinstance)->C)完全退出后再次启动首先打开的是B

Activity的Flags

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//指定Activity为"singleTask"启动模式

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//指定Activity为"singleTop"启动模式
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//位于其上的Activity都要出栈,类似"singleTask"
intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);//不会出现在Activity的历史列表中,等同于android:excludeFromRecents="true"

IntentFilter的匹配规则

为了匹配过滤列表,需要同时匹配过滤列表中的action,category,data信息。一个Activity可以有多个intentFilter,一个Intent只要能匹配任何一组intentFilter即可成功启动对应Activity

action的匹配规则

action区分大小写,必须存在,只需匹配一个

category的匹配规则可以没有,若是有,必须全部匹配(可以比过滤规则中少)
示例:

Intent intent=new Intent("com.example.root.saveinstancelearn.secondactivity");               intent.addCategory(Intent.CATEGORY_DEFAULT);startActivity(intent);
data的匹配规则

data与action类似(data语法如下)

data有两部分组成,mimeType和URI。mimeType指定媒体类型,比如image/jpeg等

匹配示例:

intent.setDataAndType(Uri.parse("file://abc"),"image/png");

ps:如果要为Intent指定完整的data,必须调用setDataAndType方法,不能先调用setData在调用setType,以为这两个方法会清除对方的值;

实例

intent.setDataAndType(Uri.parse("http://abc"),"video/mpeg");或者

intent.setDataAndType(Uri.parse("http://abc"),"audio/mpeg");

更多关于java的文章请戳这里:(您的留言意见是对我最大的支持)

Email:sxh13208803520@gmail.com

转载地址:http://ejcix.baihongyu.com/

你可能感兴趣的文章
(转)微信网页扫码登录的实现
查看>>
mariadb启动报错:[ERROR] Can't start server : Bind on unix socket: Permission denied
查看>>
nginx的信号量
查看>>
《携程的技术演进之路》读后感
查看>>
股票新闻速递 隐私声明
查看>>
LeetCode--206--反转链表
查看>>
matlab list函数参数,Matlab 函数参数汇总
查看>>
云im php,网易云IM
查看>>
测试linux vsftpd,vsftpd配置、测试
查看>>
河南农业大学c语言平时作业答案,河南农业大学2004-2005学年第二学期《C语言程序设计》期末考试试卷(2份,有答案)...
查看>>
c语言打开alist文件,C语言 文件的打开与关闭详解及示例代码
查看>>
c语言 中的共用体和结构体如何联合定义,结构体(Struct)、联合体(Union)和位域
查看>>
iPad pro能运行c语言吗,关于iPad Pro的五大槽点 你必须知道
查看>>
wordcount源代码c语言,Word Count程序(C语言实现)
查看>>
( 译、持续更新 ) JavaScript 上分小技巧(一)
查看>>
CI框架 -- URI 路由
查看>>
RPi 2B Raspbian system install
查看>>
HTTP 响应
查看>>
Android显示GIF图片
查看>>
区分SQL Server关联查询之inner join,left join, right join, full outer join并图解
查看>>