Android四大组件之Activity
来源:互联网 发布:黑魂3男捏脸数据 编辑:程序博客网 时间:2024/06/05 04:34
组件的共同点
- 它的类必须实现固定的接口或者继承自特定的类
- 需要在配置文件中配置全类名(组件的对象是系统创建的)
- 它的对象有一定的生命周期,在实现类中有着对应的生命周期回调方法
Intent和IntentFilter
- Intent:意图,是Activity、Service和BroadcastReceiver三者之间的信使,比如从一个Activity启动另一个Activity、服务或者广播接收者是需要Intent的对象。Intent对象可以携带数据。
IntentFilter:意图过滤器,是用来过滤匹配意图的,在清单文件的Activity中进行配置。action标签就是隐式意图构造函数里的action参数,category标签是额外条件,配置文件可以至少添加一个或多个category。
<activity android:name=".MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter></activity>
Intent分类
显式意图:明确指定目标组件的意图,一般操作自己应用的组件使用。
Intent(Context context, Class clazz)
隐式意图:未明确指定目标组件的意图,一般操作其他应用的组件使用。
Intent(String action)
相关Api简介
Intent
Intent(Context context, Class<?> clazz):显式意图Intent(String action):隐式意图putExtra(String name, Xxx value):携带数据Xxx getExtra(String name):取出数据setData(Uri data):设置有特定格式的Uri数据
Activity
startActivity(Intent intent): 一般启动ActivitystartActivityForResult(int reqCode, Intent intent): 带回调启动ActivityonActivityResult(int reqCode, int resultCode, Intent data): 回调方法setResult(int resultCode, Intent data): 设置要返回的结果finish(): 结束当前ActivitygetIntent(): 得到启动Activity的意图
Activity之间数据传递
Activity启动流程
Activity生命周期
- 运行状态: 可见也可操作
- 暂停状态: 可见但不可操作
- 停止状态: 不可见,但对象存在
- 死亡状态: 对象不存在
生命周期分析
推荐三篇博客:
- 深入理解Activity的生命周期
- 基础总结篇之一:Activity生命周期
- 深入理解onSaveInstanceState & onRestoreInstanceState 方法
总结:
- onSaveInstanceState(): onSaveInstanceState()会在onPause()或onStop()之前执行,当系统销毁一个Activity的时候,如内存不足、用户直接按Home键等,onSaveInstanceState()方法会被调用;当如果是用户按返回键,则不会调用onSaveInstanceState方法,因为系统觉得没必要保存数据。如果我们没有复写onSaveInstanceState()方法, 此方法的默认实现会自动保存activity中的某些状态数据,比如activity中各种UI控制项的状态。如果我们需要覆写onSaveInstanceState()方法,一般会在第一行代码中调用该方法的默认实现:super.onSaveInstanceState(outState);
onRestoryInstanceState(): onRestoreInstanceState()会在onStart()和onResume()之间执行,只有在activity销毁重建的时候onRestoreInstanceState()才会调用。当Activity被系统撤销后重新建立时,保存以及恢复数据的函数调用顺序是:onSaveInstanceState(保存数据)–>onCreate(恢复数据allstate)–>onRestoryInstanceState(恢复数据HierarchyState);
推荐博客第二篇中实际测试结果如下,略有不同:
启动Activity:
07-28 09:23:43.957 22220-22220/guo.ping.activitydemo I/MainActivity: onCreate()07-28 09:23:43.969 22220-22220/guo.ping.activitydemo I/MainActivity: onStart()07-28 09:23:43.969 22220-22220/guo.ping.activitydemo I/MainActivity: onResume()
跳转到其他Activity,或按下Home键回到主屏(没有销毁):
07-28 09:29:59.029 22220-22220/guo.ping.activitydemo I/MainActivity: onPause()07-28 09:29:59.513 22220-22220/guo.ping.activitydemo I/MainActivity: onSaveInstanceState()07-28 09:29:59.513 22220-22220/guo.ping.activitydemo I/MainActivity: onStop()
从后台回到前台:
07-28 09:31:46.417 22220-22220/guo.ping.activitydemo I/MainActivity: onRestart()07-28 09:31:46.417 22220-22220/guo.ping.activitydemo I/MainActivity: onStart()07-28 09:31:46.417 22220-22220/guo.ping.activitydemo I/MainActivity: onResume()
当前Activity不完全可见时调用的方法为:
07-28 09:33:19.409 22220-22220/guo.ping.activitydemo I/MainActivity: onPause()07-28 09:33:19.729 22220-22220/guo.ping.activitydemo I/MainActivity: onSaveInstanceState()
按回退键使Activity从被覆盖回到前面,或者按解锁键解锁屏幕:
07-28 09:34:21.533 22220-22220/guo.ping.activitydemo I/MainActivity: onResume()
退出:
07-28 09:36:02.721 22220-22220/guo.ping.activitydemo I/MainActivity: onPause()07-28 09:36:02.797 22220-22220/guo.ping.activitydemo I/MainActivity: onStop()07-28 09:36:02.862 22220-22220/guo.ping.activitydemo I/MainActivity: onDestory()
旋转屏幕时:
07-28 09:37:44.341 1638-1638/guo.ping.activitydemo I/MainActivity: onPause()07-28 09:37:44.341 1638-1638/guo.ping.activitydemo I/MainActivity: onSaveInstanceState()07-28 09:37:44.341 1638-1638/guo.ping.activitydemo I/MainActivity: onStop()07-28 09:37:44.341 1638-1638/guo.ping.activitydemo I/MainActivity: onDestroy()07-28 09:37:44.369 1638-1638/guo.ping.activitydemo I/MainActivity: onCreate()07-28 09:37:44.369 1638-1638/guo.ping.activitydemo I/MainActivity: onStart()07-28 09:37:44.369 1638-1638/guo.ping.activitydemo I/MainActivity: onRestoreInstanceState()07-28 09:37:44.369 1638-1638/guo.ping.activitydemo I/MainActivity: onResume()
Activity任务栈
- 在Android中,系统用Task Stack (Back Stack)结构来存储管理启动的Activity对象
- 一个应用启动,系统就会为其创建一个对应的Task Stack来存储并管理该应用的Activity对象
- 只有最上面的任务栈的栈顶的Activity才能显示在窗口中
Activity的启动模式
- standard: 标准模式,每次调用startActivity()方法就会产生一个新的实例。
- singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例;如果不位于栈顶,会产生一个新的实例。
- singleTask: 只有一个实例, 默认在当前Task中。
- singleInstance: 只有一个实例, 创建时会新建一个栈, 且此栈中不能有其它对象。
最后
当使用隐式意图时,可以添加category来区别相同的action,category也可以自定义,但是必须至少加上一个Android系统中定义的。
<activity android:name=".SecondActivity"> <intent-filter> <action android:name="android.intent.action.OTHERACTIVITY"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="HAHA"/> </intent-filter></activity><activity android:name=".ThirdActivity"> <intent-filter> <action android:name="android.intent.action.OTHERACTIVITY"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter></activity>
在代码中,可以通过给Intent对象调用addCategory(“xxx”)方法添加条件便于更加明确。
Intent intent = new Intent("android.intent.action.OTHERACTIVITY");intent.addCategory("HAHA");startActivity(intent);
个人公众号:每日推荐一篇技术博客,坚持每日进步一丢丢…欢迎关注,想建个微信群,主要讨论安卓和Java语言,一起打基础、用框架、学设计模式,菜鸡变菜鸟,菜鸟再起飞,愿意一起努力的话可以公众号留言,谢谢…
- Android四大组件之Activity
- Android四大组件之Activity
- Android四大组件之Activity
- Android四大组件之Activity
- android四大组件之Activity
- android四大组件之Activity
- android四大组件之Activity
- android四大组件之Activity
- android四大组件之 Activity
- Android四大组件之Activity
- Android四大组件之Activity
- Android四大组件之Activity
- Android四大组件之Activity
- Android四大组件之Activity
- Android 四大组件之Activity
- android 四大组件之activity
- Android 四大组件之 Activity
- android四大组件之Activity
- 计算机网络基础知识
- Tensorflow 如何使用自己cifar10训练模型检测一张任意的图片
- QT 实现自定义的IP地址控件
- Lumen 有问题? 填坑吧
- Vue中Class与Style绑定
- Android四大组件之Activity
- 网狐6.6完整商业版源码架设最新棋牌游戏源码下载
- 推荐系统
- js模拟手机短信对话
- java 用单链表实现队列
- Maven
- caffe (10) 使用python测试多张图片统计分类结果
- java中的简单碰撞检测
- 最大流-dinic算法