Android Activity

简述Android系统架构

Android系统采用分层架构,有高到低,可分为:
1.应用程序层
是一个核心应用程序的集合,所有安装在手机上的应用程序都属于这一层,如联系人,短信,小游戏等。
2.应用程序框架层
提供构建应用程序时用到的各种API。如视图View,活动管理器Activity Manager,通知管理器Notification Manager等。
3.核心类库
包含系统库和Android运行环境。主要通过C/C++库来为Android系统提供主要的特性支持,如SQLite库提供了数据库的支持,OpenGL/ES库提供了3D绘图的支持,Webkit库提供了浏览器内核的支持。
4.Linux内核
为Android设备的各种硬件提供了底层的驱动,如显示驱动,音频驱动,蓝牙驱动,电源管理驱动等。

Android各版本的特性
  • 5.0版本:
    全新Material Design设计风格
    支持多种设备
    全新的通知中心设计
    改进安全性
    新的API支持,蓝牙4.1,USB Audio,多人分享
  • 6.0版本:
    权限管理
    APP关联
    安卓支付(Android Pay)
    指纹支持
    电量管理
Activtity生命周期

从创建到销毁的全过程:启动、运行、暂停、停止、销毁。其中启动和销毁是过渡状态,不会停留。
这里写图片描述
1.启动A页面:onCreate()→onStart()→onResume();
2.跳转B页面或按Home键/锁屏:onPause()→onSaveInstanceState()→onStop(); 按Back键返回/解锁:onRestart()→onStart()→onResume();
3.弹框:onPause(); 按Back键返回:onRestart();
4.退出页面:onPause()→onStop()→onDestroy();
5.切横屏(执行一次)/切竖屏(执行两次):onPause()→onSaveInstanceState()→onStop()→onDestroy()→onCreate()→onStart()→onRestoreInstanceState()→onResume();
注意事项:
设置android=configChanges=”orientation”时,切横竖屏都只执行一次。
设置android=configChanges=”orientation|keyboardHidden”时,切屏时不会重新调用各自的生命周期,只会执行onConfigurationChanged()方法。
切屏时,想保持页面数据,重写onSaveInstanceState()方法,若想恢复数据,重写onRestoreInstanceState()方法。

  • Android的启动方式

1.显示启动:创建Intent后直接指定包名和类名即可。

//1.设置相应Activity的class来启动
Intent intent = new Intent(this, OtherActivity.class);
startActivity(intent);
//2.设置包名和类名来启动
Intent intent2 = new Intent();
intent2.setClass("com.android.activity", "com.android.activity.OtherActivity");
startActivity(intent2);

2.隐形启动:通过动作、类型、数据匹配对应的组件。

//拨打电话Activity
Intent intent3 = new Intent();
intent3.setAction(com.android.activity.ACTION_START);//设置动作
intent3.addCategory("com.android.activity.MY_CATEGORY");//设置数据匹配
startActivity(intent3);

//在清单文件
<activity android:name="com.android.activity.OtherActivity">
    <intent-filter>
       <action android:name="com.android.activity.ACTION_START"/>
       <category android:name="com.android.activity.MY_CATEGORY"/>
    <intent-filter>
</activity>

注意事项:
1.若代码的I0ntent对象有action,categorydata这几个属性,则< intent-filter >必须匹配这些属性的内容,才能响应该activity。
2.不写addCategory()方法,会有默认的category值“android.intent.category.DEFAULT”添加到Intent中。
3.每个Intent中只能指定一个action,而category可以是多个。

Android的启动模式

1.standard模式
默认启动,每启动一个Activity就在栈顶创建一个新的实例。先进后出。
这里写图片描述
2.singleTop模式
判断要启动的Activity实例是否位于栈顶,是就复用,否就创建新的实例。
这里写图片描述
3.singleTask模式
若须要创建的Activity已经处于栈中时,此时不会创建新的Activity,而是将存在栈中的Activity上面的其他Activity所有销毁,使它成为栈顶。
这里写图片描述
4.singleInstance模式
全局单例模式(加强的SingleTask模式),此模式的Activity只有一个实例,且这个实例独立运行在一个任务栈中,不允许有别的Activity存在。用于为了在不同程序中共享同一个Activity实例。
这里写图片描述

Android之间如何传递数据

Intent是一个意图,用于协助完成Android各个组将之间的通信。
Intent用于Activity,Service,BroadcastReceiver之间传递数据。
传递的数据类型有基础类型,数组,Bundle,Serializable,Parceable对象。
数据回传:
startActivityForResult()方法,可以在当前Activity销毁时返回一个结果给上一个Activity,实现数据回传功能。
重写onActivityResult()方法来得到返回的数据。
PendingIntent:延迟意图。用于处理非即时Intent。比如消息通知。

已调用多个Activity后如何安全退出?

对于单一的Activity,直接finish();对于多个Activity,想在最后打开的Activity中直接退出应用程序,需要将每个Activity关掉,然后退出。
1.抛异常强制退出
使程序弹出Force Close(强制关闭)的窗口,用户体检差。
2.记录打开的Activity并逐个关闭
需要抽取到Activity的父类中来实现,在父类的onCreate()方法中调用Activity集合的add()方法把每一个Activity添加到该集合中。创建一个关闭所有Activity的KillAll()方法,在某个Activity中想要退出App就调用KillAll()方法即可。
3.发送特定广播实现安全退出
需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
注册接收者的逻辑可以抽取到父类中实现,需要安全退出应用时,仅需发送action为注册时指定的action即可。所有开启Activity都注册有监听此广播的广播接收者,收到此类广播时,直接调用finish()方法,关闭当前Activity。
4.递归退出每个Activity
当需要打开新的Activity时,使用startActivityForResult()方法打开新Activity,需要退出应用时,自定义一个标志退出的flag,在各个Activity的onActivityResult()方法中处理这个Flag来关闭。

如何应对后台的Activity被系统回收?

1.每个手机内存是有限的,当系统发现内存不足时,会将后台运行的一些应用程序杀死,回收这部分内存。
2.如果没有对横竖屏切换的情况进行任何处理,那么在Acitivity进行横竖屏切换时,Activity会先被完成销毁回收,再重新创建,导致页面数据丢失。
3.当App长期在后台运行时,有事出于省电等节省资源的目的,系统也会将App回收掉。
有一个onSavedInstanceState(Bundle obj)方法,当系统销毁Activtiy时,会将Activity的状态信息以键值对形式存储在bundle对象中。
重写onSavedInstanceState()方法,将保存页面数据全部存到Bundle对象中。在onCreate()方法中通过bundle对象中保持的用户数据来做一些恢复数据的操作,防止Activity被系统回收时造成用户数据丢失。

转载文章:
Android:图解四种启动模式 及 实际应用场景解说:
https://www.cnblogs.com/claireyuancy/p/7387696.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值