一个人的生活 新奇视 新感觉 www.x74.cn
分类: Android平台
2017-11-14 17:21:06
1。管理应用程序生命周期
1.1。失去记忆的杀手
管理系统资源有限的Android系统可以终止正在运行的应用程序。 每个应用程序开始在一个新的过程下的一个独特的ID有一个独特的用户。 如果Android系统需要释放资源,它遵循一个简单的设置。
如果Android系统需要终止过程遵循以下优先系统。
表1。优先
过程状态 描述 优先
前景
一个应用程序中,用户通过活动互动,或具有服务势必会对这样的活动。 如果服务是执行的一个生命周期方法或广播接收机运行onreceive(的)方法
一
可见
用户不与活动的互动,但活动仍然是(部分)可见或应用服务是由一个活跃而可见的活动使用。
二
服务
与正在运行的服务,不符合1或2的应用。
三
背景
只有停止活动,没有服务或执行接收机中的应用。 Android他们保持在一个最近最少使用(LRU)列表,如果需要终止一个最小。
四
空
没有任何活性成分的应用。
五
在空荡荡的列出所有的进程添加到最近最少使用列表(LRU列表)。过程是开始在 列表将被从记忆的杀手。 如果重新启动应用程序的用户,会结束到这个队列。 如果达到最低的优先,如再。
LRU list for process determination
1.2。应用
你可以在你的Android清单文件中指定一个自定义应用程序类。
应用对象已经是第一个部件开始。 也是组成的总是最后一个应用程序,这是。
这个对象提供了以下主要的生命周期方法:
onCreate()-应用程序的第一部分开始之前调用
onlowmemory()“当Android系统的应用要求,清理内存
ontrimmemory()“当Android系统的应用要求,清理内存。 这消息包括指示其位置的应用。 例如恒trim_memory_moderate显示过程中的背景是在LRU列表;释放内存可以帮助系统保持运行后,在进程列表中更好。
onterminate(的)-仅用于测试,在生产不叫
onconfigurationchanged(的)“每当配置的变化
想知道内容供应商的生命周期?
一旦访问一个内容提供者是从来没有停止过个别。 它停止,如果整个应用过程。
2。活动的生命周期
2.1。一个活动状态
一个活动是在不同的国家,取决于它与用户进行交互。
表2。活动状态
状态 描述
运行
活动是可见的与用户交互。
停下来
活动是可见的但部分遮蔽,实例运行但有可能被系统杀死。
停止
活动是不可见的,实例运行但有可能被系统杀死。
被杀死的
活动已经终止的系统通过调用它的finish()方法
2.2。生命周期方法
活动有一个预定义的生命周期和一定的方法被称为。
表3。重要活动的生命周期方法
方法 目的
onCreate()
“然后创建活动。 用于初始化活动,例如创建用户。
void onResume()
“如果活动得到再次可见和用户开始再活动的相互作用。 用来初始化字段,登记的听众,绑定服务,
void onPause()
“一旦进入另一个活动的前景。 总是叫前活动不再是不可见的。 用来释放资源或保存中的应用。例如你注销的听众,意图接收器,脱离服务或删除系统服务的听众。
onStop()
“一旦活动不再是可见的。 时间或CPU密集的关机操作,如写信息到数据库应该在onStop()方法。 这个方法保证被称为API。
这些方法的流程如下图所示。
Activity life cycle
Android有更多的生命周期方法,但不是所有这些方法都保证被调用。 例如onDestroy()方法不能保证被调用,因此你通常不使用它。
在 看到其他方法的更多信息官方活动的生命周期的文件。
2.3。终止活动
如果配置发生变化,Android重启目前可见的活动。
另外,如果Android杀死的应用过程中,所有的活动都终止。 之前终止其相应的生命周期方法。
这个void onPause()方法通常用于停止框架的听众和UI更新。 onStop()方法是用来保存应用程序的数据。 这些方法保证活动前是被称为。
如果用户切换回应用程序已被系统终止,它是重新启动。 其活动栈的重建。void onResume()用于登记了听众和触发UI更新的基础上保存的数据。
的活性和应用需要确保保存其状态和日期,这个数据是正确还原。
这是一个常见的误解,从记忆的杀手从Android也杀了个人活动。 然而Dianne Hackborn从Android核心团队参与了记忆的杀手实施澄清,Android系统只杀进程而不是个人活动。在StackOverflow戴安娜回答。
2.4。活动实例的状态
实例的状态描述一个活动的UI状态。 这是非持久性的应用数据。 这是通过在活动启动由于配置更改。 活动负责保存和恢复。
这个onsaveinstancestate()可用于存储此实例状态为束在 。束可以包含:
原始数据类型
字符串
这是对象打包的或序列化类型
以上类型的数组
坚持着束数据是通过在启动活动的onCreate()方法和onrestoreinstancestate(的)作为参数。
如果你重写onsaveinstancestate()和onrestoreinstancestate(的),你必须调用超。 Android视图存储他们的数据通过一个电话view.onsaveinstancestate从onsaveinstancestate()活动的方法。 为,编辑存储的内容通过此方法的默认调用。
为此,布局需要定义ID的这些观点。
这个onrestoreinstancestate(的)或onCreate()方法可用于重新创建实例范围。
选择使用onrestoreinstancestate(的)恢复实例状态的方法。 这种方法设置恢复初始的分离。
如果用户有一个活动的相互作用和压后退按钮或者finish()一个活动的方法,活动是从 当前活动栈和循环删除。在这种情况下没有实例 状态保存和onsaveinstancestate()方法不会被调用。
如果用户按下“主页按钮,活动实例的状态必须被保存。 onsaveinstancestate()方法被调用。 如果用户再次切换到活动如果Android终止它,它的活动堆栈是重建。 保存束提供了onrestoreinstancestate(的)和onCreate()方法.
2.5。数据保存在配置改变
这个Android的架构组件库提供一个简单而稳定的方法来保存数据在应用程序重新启动。
实例视图模型负责准备和持续的数据的用户界面。
这个视图模型自动保留在配置过程中的变化。 当业主活动或片段后,oncleared(的)方法对视图模型被称为 这个方法。视图模型可以清理资源。
它拥有的数据立即可用的下一个活动或片段实例。
结合mutablelivedata也可以用于异步读取数据并通知观察者如果数据变化。
这个共享的可观察到的数据也可用于片段通信。
一个片段设置数据,和其他碎片的观察数据。 这个结果在一个非常简单的沟通模式。
三.练习:通知跟踪生命周期
在这个练习中你可以创建一个应用程序,允许你观察Android系统调用你的Android应用程序的生命周期。
3.1。创建项目
与顶层包的名称创建一个新项目com.vogella.android.lifecycle.activity。
创建下面的类,用于报告的生命周期事件的通知。
旅行包 com.vogella.android.lifecycle.activity;进口 android.app.activity;进口 android.app.notification;进口 android.app.notificationchannel;进口 android.app.notificationmanager;进口 android.os.build;进口 android.os.Bundle;公共 类 traceractivity 延伸活动{公共 静止的 最终的 字符串 TRACER = “示踪“;@Override
受保护的 无效onCreate(Bundle savedinstancestate){超级的。onCreate(savedinstancestate);
createchannel();
“创建时的回调函数“
);@Override
受保护的 无效void onPause(){超级的onpause();
通知。“onPause“
);@Override
受保护的 无效void onResume(){超级的.onresume(
notify();“onResume“
);@Override
受保护的 无效onStop(){超级的.onstop(
notify();“onStop“
);@Override
受保护的 无效onDestroy(){超级的.ondestroy
(Object();“销毁“
);@Override
受保护的 无效onRestoreInstanceState(Bundle savedinstancestate){超级的。onRestoreInstanceState(savedinstancestate);
通知“onrestoreinstancestate“
);@Override
受保护的 无效onSaveInstanceState(Bundle保存){超级的。onSaveInstanceState(保存);
通知“onSaveInstanceState“
);私人 无效通知(字符串methodename){字符串 name = 这.getname .getclass()();字符串[ ] strings = name.split(“◎。“);通知建设者notificationbuilder;如果 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
notificationBuilder = 新 通知.builder(这
,示踪剂);其他的{/ / noinspection贬低
notificationBuilder = 新 通知.builder(这
);通知 notification = notificationBuilder
.setContentTitle(methodName + “ “[ strings.length字符串—一
.setautocancel(])真正的)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentText(name).build();
NotificationManager notificationManager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify((int)系统currenttimemillis(),通知);
。私人 无效 createChannel() {
NotificationManager mNotificationManager = getSystemService(NotificationManager.class);
/ /的ID的频道。
字符串 id = TRACER;
/ /域名的用户可见的通道。
字符序列 name = “活动LiveCycle示踪“;/ /的描述用户可见的通道。
字符串 description = “可以跟踪活动的生命周期“;int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel mChannel = 新notificationchannel(ID、名称、重要性);“通知/ configure频道。mchannel.setdescription(描述);
mnotificationmanager.createnotificationchannel(mchannel
} });
3.2。创建你的活动
创建两个活动推广这一 还创建一个布局。secondactivity。
旅行包 com.vogella.android.lifecycle.activity;进口 android.os.Bundle;进口 android.app.activity;进口 android.view.menu;公共 类 secondactivity 延伸traceractivity {@Override
受保护的 无效onCreate(Bundle savedinstancestate){超级的。onCreate(savedinstancestate);
setContentView(r.layout。activity_second);
}
第一个活动应该允许启动第二个通过意图 布局调整。
旅行包 com.vogella.android.lifecycle.activity;进口 android.content.intent;进口 android.os.Bundle;进口 android.view.view;公共 类 主要活动 延伸traceractivity {@Override
受保护的 无效onCreate(Bundle savedinstancestate){超级的。onCreate(savedinstancestate);
setContentView(r.layout。activity_main);公共 无效onClick(意见 view) {
Intent intent = 新意向书(这,secondactivity。类);
startActivity(意图);
}
确保活动在Android Manifest和注册你的主要活动作为主要切入点。
3.3。测试
启动您的应用程序和触发第二活性。 审查的通知,确保你知道为什么这种秩序是。
Notifications about the lifecycle
按第二活动返回按钮。 验证onsaveinstancestate()不叫。 解释为什么不。
按第二活动主页按钮。 验证onsaveinstancestate()被称为 解释为什么它是。
开始第二活性。 定位你的开关模拟器看哪个生命周期方法的活动被称为。 是第一个活动也重新创建或第二
激活不保留活动设置在开发商的选择 再次测试的方法。
3.4。实例的状态
创建一个字符串数组添加一个微调为了你的第一个活动使用这个数组。 以下列表strings.xml和布局文件的第一个活动使用。
<资源>
<字符串 姓名=“APP名称_“>生命周期字符串> < <字符串 姓名=“行动_设置“>设置字符串> < <字符串 姓名=“hello_world“>你好世界!字符串> < <字符串数组 姓名=“operating_systems“> < item >Ubuntu<项目> < item >安卓<项目> < item >iOS<项目> ></字符串数组
<资源>
< LinearLayout xmlns:Android=““
xmlns:工具=““
安卓:ID=“ID / linearlayout1 @“
安卓:layout_width=“match_parent“
安卓:layout_height=“match_parent“
安卓:定位=“垂直的“
工具:语境=“主要活动。“ >
<螺母
安卓:ID=“ID /怪人”“
安卓:layout_width=“包装_高兴“
安卓:layout_height=“包装_高兴“
安卓:layout_marginright=“58dp“
android:entries=“@阵列/ operating_systems“ /> <按钮 安卓:ID=“ID / @ Button1“
安卓:layout_width=“包装_高兴“ 安卓:layout_height=“包装_高兴“ 安卓:onclick=“onclick“ 安卓:layout_gravity=“底座“ 安卓:文本=“开始新的活动“ />
></子元素
Android恢复微调自动状态。 验证选择的,微调是保存和恢复之间的配置更改的Android系统。 Android做为纺纱与一个固定的输入的基础上的。
除去现在在布局固定数组赋值给微调通过源代码。
/ /配置微调代码
Spinner spinner = (Spinner) findViewById(R.id.spinner);
字符串[ ] values = getResources().getStringArray(R.array.operating_systems);
ArrayAdapter<字符串> adapter =
新 ArrayAdapter<字符串>(这,android.r.layout.simple_list_item_1,值);
飞旋。setadapter(适配器;
取出你的布局文件固定分配。
< LinearLayout xmlns:Android=““
xmlns:工具=““
安卓:ID=“ID / linearlayout1 @“
安卓:layout_width=“match_parent“
安卓:layout_height=“match_parent“
安卓:定位=“垂直的“
工具:语境=“主要活动。“ >
<螺母
安卓:ID=“ID /怪人”“
安卓:layout_width=“包装_高兴“
安卓:layout_height=“包装_高兴“
安卓:layout_marginright=“58dp“
/> <按钮 安卓:ID=“ID / @ Button1“
安卓:layout_width=“包装_高兴“ 安卓:layout_height=“包装_高兴“ 安卓:onclick=“onclick“ 安卓:layout_gravity=“底座“ 安卓:文本=“开始新的活动“ />
></子元素
验证,在这种情况下,微调的位置仍然是自动恢复。
4。练习:使用视图模型
在这个练习中你可以创建一个应用程序使用视图模型共享状态。
4.1。创建项目
与顶层包的名称创建一个新项目com.vogella.android.viewmodel。
4.2。Add dependencies
在主build.gradle文件
一个项目{
库{
jcenter()
Maven { URL ”
} } }
在主应用程序/ build.gradle文件
实施“Android。拱。生命周期:时间:1.0.0-rc1”
实施“Android。拱。生命周期:扩展:1.0.0-rc1”
annotationprocessor“Android。拱。生命周期:编译:1.0.0-rc1”
4.3。实现类
创建以下类演示使用视图模型。
旅行包 com.vogella.android.viewmodel;进口 日期类型;公共 类 任务{公共 最终的 长身份证件;公共 字符串总结;公共 字符串描述;公共 布尔完成;/ /公共日期交货期
公共任务(长身份证件,字符串总结,字符串描述,布尔做){这.id = id;
这.summary = summary;
这.description = description;
这.done = done;
// this.dueDate = dueDate;}公共 静止的taskbuilder建设者(){退货 新taskbuilder();
公共 静止的 类 Taskbuilder{私人 长身份证件;私人 字符串 summary = ““;私人 字符串 description = ““;私人 布尔 done = 假;私人 日期交货期;公共taskbuilder setId(长ID){这.id = id;
退货 这;
公共TaskBuilder setSummary(字符串摘要){这.summary = summary;
退货 这;
公共taskbuilder setDescription(字符串描述){这.description = description;
退货 这;
公共TaskBuilder setDone(布尔做){这.done = done;
退货 这;
公共setduedate Taskbuilder(日期交货期){这.dueDate = 新 日期(duedate.gettime());退货 这;
公共任务建立(){退货 新任务编号,摘要,做了描述,
);} }@Override
公共 字符串toString(){退货 “任务{“ “id=“身份证件“, summary='“概要''' “, description='“描述''' “, done=“完成'}'
};
旅行包 com.vogella.android.viewmodel;进口 android.arch.lifecycle.livedata;进口 android.arch.lifecycle.mutablelivedata;进口 android.arch.lifecycle.viewmodel;进口 java.util.arraylist;进口 java.util.list;公共 类 myviewmodel 延伸viewmodel {私人 MutableLiveData<列表
公共 LiveData<列表> getTasks() { 如果 (tasks == 无效的) { tasks = 新 MutableLiveData<列表 >(); loadTasks(); } 退货
任务;私人 无效loadtasks() {试用{线睡眠(。五千
);抓住(interruptedexceptione){
e.printstacktrace();}列表
Task task = Task.builder().setId(一setsummary()。“测试的问题“)。build();
列表。添加(任务);
setValue(任务;/ /做异步操作以获取用户
} }
旅行包 com.vogella.android.viewmodel;进口 android.arch.lifecycle.lifecycleactivity;进口 android.arch.lifecycle.observer;进口 android.arch.lifecycle.viewmodelproviders;进口 android.os.Bundle;进口 android.support.annotation.nullable;进口 android.widget.textview;进口 java.util.list;公共 类 主要活动 延伸lifecycleactivity {@Override
受保护的 无效onCreate(Bundle savedinstancestate){超级的。onCreate(savedinstancestate);
setContentView(r.layout。activity_main;最终的 MyViewModel model = ViewModelProviders.of(这)。得到(myviewmodel。类);
模型。gettasks()。观察(,新 观察者<列表
@Override 公共 无效onchanged(@空 列表 users) {
/ /更新用户界面
TextView textView = findViewById(R.id.result);
textView.setText(model.getTasks().getValue().get(零.tostring)());} }
);} }
4.4。验证
启动您的应用程序。 启动数据应显示有延迟。