资讯专栏INFORMATION COLUMN

Android四大组件之Activity

evin2016 / 1441人阅读

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

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

Activity的生命周期

分别覆写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 onCreate
com.example.root.activitylifecycle I/target: Activity onStart
com.example.root.activitylifecycle I/target: Activity onResume
com.example.root.activitylifecycle I/target: Activity onPause
com.example.root.activitylifecycle I/target: Activity onStop
com.example.root.activitylifecycle I/target: Activity onDestroy

屏幕灭掉

com.example.root.activitylifecycle I/target: Activity onCreate
com.example.root.activitylifecycle I/target: Activity onStart
com.example.root.activitylifecycle I/target: Activity onResume
com.example.root.activitylifecycle I/target: Activity onPause
com.example.root.activitylifecycle I/target: Activity onStop

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

com.example.root.activitylifecycle I/target: Activity onRestart
com.example.root.activitylifecycle I/target: Activity onStart
com.example.root.activitylifecycle I/target: Activity onResume

跳转到其他activity

com.example.root.activitylifecycle I/target: Activity onCreate
com.example.root.activitylifecycle I/target: Activity onStart
com.example.root.activitylifecycle I/target: Activity onResume
com.example.root.activitylifecycle I/target: Activity onPause
com.example.root.activitylifecycle I/target: SecondActivity onCreate
com.example.root.activitylifecycle I/target: SecondActivity onStart
com.example.root.activitylifecycle I/target: SecondActivity onResume
com.example.root.activitylifecycle I/target: Activity onStop

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

com.example.root.activitylifecycle I/target: SecondActivity onPause
com.example.root.activitylifecycle I/target: Activity onRestart
com.example.root.activitylifecycle I/target: Activity onStart
com.example.root.activitylifecycle I/target: Activity onResume
com.example.root.activitylifecycle I/target: SecondActivity onStop
com.example.root.activitylifecycle I/target: SecondActivity onDestroy

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

com.example.root.activitylifecycle I/target: Activity onPause
com.example.root.activitylifecycle I/target: SecondActivity onStop
com.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 onSaveInstanceState
com.example.root.activitylifecycle I/target: Activity onRestoreInstanceState
com.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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66955.html

相关文章

  • Android四大组件Service

    摘要:注意每个必须在中通过来声明。执行具体的下载任务接下来我们在中通过来绑定和解除绑定可以看到,这里我们首先创建了一个的匿名类,在里面重写了方法和方法,这两个方法分别会在与建立关联和解除关联的时候调用。 前言 Hi,大家好,上一期我们讲了如何使用BroadcastReceiver,这一期我们讲解Android四大组件之Service相关知识。每天一篇技术干货,每天我们一起进步。 耐心专注不仅...

    archieyang 评论0 收藏0
  • Android四大组件BroadcastReceiver

    摘要:作为的四大组件之二,其应用场景非常多。作用可以监听或接收应用或系统发出的广播消息,并做出响应。可以指定独立的进程四大组件都可以通过此属性指定自己的独立进程。对于应用内广播的动态注册方式,回调中的返回值是。 前言 Hi,大家好,又双见面啦,上一期我们讲了如何使用Activity,肯定有不少小伙伴已经创建了属于自己的FirstActivity,那么这一期我们主要为大家介绍第二个重要组件Br...

    plus2047 评论0 收藏0
  • Android四大组件BroadcastReceiver全解析

    摘要:但是,一定会被执行,从而保证了广播在死亡前一定会被注销,从而防止内存泄露。对于应用内广播的动态注册非方式,回调中的返回值是 前言 BroadcastReceiver(广播接收器),属于Android四大组件之一 在Android开发中,BroadcastReceiver的应用场景非常多 今天,我将详细讲解关于BroadcastReceiver的一切相关知识 目录 showImg(...

    yearsj 评论0 收藏0
  • Android四大组件Activity全解析

    摘要:该始终是其唯一仅有的成员,由此启动的任何,如果没有指定返回栈名称,则新启动的放入默认的返回栈如果指定了返回栈名称,则将新启动的放入指定的返回栈中。 1. 简介        本篇不针对于新手,而是对于Activity中一些常识或者问题进行总结。Activity是Android四大组件之一,为用户提供与系统交互的界面,每一个应用都有一个或者多个Acticity,这样会有各种各样的细节问题...

    leone 评论0 收藏0

发表评论

0条评论

evin2016

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<