一. Activity

先展示一张Activity的生命周期图:

1.1 Activity状态

只有下面三个状态是静态的,可以存在较长的时间内保持状态不变。(其它状态只是过渡状态,系统快速执行并切换到下一个状态)   

  • 运行(Resumed):

    • 当前activity在最上方,用户可以与它进行交互。(通常也被理解为”running” 状态)
    • 此状态由onResume()进入,由onPause()退出
  • 暂停(Paused):
    • 当前activity仍然是可见的。但被另一个activity处在最上方,最上方的activity是半透明的,或者是部分覆盖整个屏幕。被暂停的activity不会再接受用户的输入。
    • 处于活着的状态(Activity对象存留在内存,保持着所有的状态和成员信息,仍然吸附在window manager)。
    • 当处于极度低内存的状态时,系统会杀掉该activity,释放相应资源。
    • 此状态由onPause()进入,退出可能onResume()或者onCreate()重新唤醒,或者被onStop()结束
  • 停止(Stopped):
    • 当前activity完全被隐藏,不被用户可见。可以认为是处于在后台。
    • 处于活着的状态(Activity对象存留在内存,保持着所有的状态和成员信息,不再吸附在window manager)。
    • 由于对用户不再可见,只要有内存的需要,系统就会清理该activity用以释放内存资源。
    • 该状态由onStop()进入,或onRestart()或者onCreate()重新唤醒,或者被onDestroy()彻底死亡。
    • 其它状态 (Created与Started)都是短暂的,系统快速的执行那些回调函数并通过。

当acitivty处于暂停或者停止状态,系统可以通过finish()或 android.os.Process.killProcess(android.os.Process.myPid())来杀死其进程。当该activity再次被打开时(结束或杀死后),需要重新创建Ativity,走一遍完整的流程。

1.2 Activities调用流程

当Activity A 启动 Activity B时,两个activity都有自个的生命周期。Activity A暂停或者停止,Activity B被创建。记住,在Activity B创建之前,Activity A并不会完全停止,流程如下:

  1. Activity A 进入onPause();
  2. Activity B 依次 onCreate(), onStart(), onResume()。(此时Activity B得到了用户焦点)
  3. 如果Activity A不再可见,则进入onStop().

1.3 代码实践

利用下面的DemoActivity代码,可亲自感受每一个阶段的状态。比如点返回键,home键,menu键等操作,可以借助通过logcat查看该activity到底处于哪种状态,这里就不说结果了,自己动手,丰衣足食。

import android.app.Activity;
import android.os.Bundle;
import android.util.Log; public class DemoActivity extends Activity {
private static final String TAG = "demo"; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG,"onCreate::The activity is being created.");
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart::The activity is about to become visible.");
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume::The activity has become visible.");
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause:: Another activity is taking focus.");
}
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop::The activity is no longer visible");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy::The activity is about to be destroyed");
}
}

  

二. Service

先展示一张Service的生命周期图:

2.1 启动方式:

service有两种启动方式, 不同的启动方式决定了Service具有两种生命周期的可能(并非互斥的两种)。

  1. start方式:onCreate(),onStartCommand()。onDestroy释放资源。
  2. bind方式: onCreate(),onBind()方法。需要所有client全部调用unbindService()才能将Service释放资源,等待系统回收。

2.2 代码实践

利用下面的DemoService代码,通过logcat自行感受每一个阶段的状态与场景的关系。

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log; public class DemoService extends Service {
private static final String TAG = "demo"; int mStartMode; // service被杀掉的方式
IBinder mBinder; // clients绑定接口
boolean mAllowRebind; // 是否允许onRebind @Override
public void onCreate() {
Log.i(TAG,"onCreate::The service is being created");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG,"onStartCommand::The service is starting");
return mStartMode;
}
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG,"onBind::A client is binding to the service");
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
Log.i(TAG,"onUnbind::All clients have unbound");
return mAllowRebind;
}
@Override
public void onRebind(Intent intent) {
Log.i(TAG,"onRebind::A client rebind to the service " +
"after onUnbind() has already been called");
}
@Override
public void onDestroy() {
Log.i(TAG,"onDestroy::The service is no longer used");
}
}

  

Activity与Service生命周期的更多相关文章

  1. Android(java)学习笔记171:Service生命周期

    1.Service的生命周期         Android中的Service(服务)与Activity不同,它是不能和用户交互,不能自己启动的,运行在后台的程序,如果我们退出应用的时候,Servic ...

  2. Android Service生命周期及用法

    Service概念及用途:Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行, ...

  3. Service生命周期以及应用

    Service概念及用途: Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行 ...

  4. Service具体解释(二):Service生命周期

    < Service具体解释(一):什么是Service> < Service具体解释(二):Service生命周期> <Service具体解释(三):Service的使用 ...

  5. Android中startService的使用及Service生命周期

    Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法.本文仅仅探讨纯startService的使用.不 ...

  6. Service 生命周期

    有了 Service 类我们如何启动他呢,有两种方法: • Context.startService() • Context.bindService()  1.  在同一个应用任何地方调用 start ...

  7. Android Service 生命周期

    Service概念及用途: Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行 ...

  8. Android(java)学习笔记114:Service生命周期

    1.Service的生命周期         Android中的Service(服务)与Activity不同,它是不能和用户交互,不能自己启动的,运行在后台的程序,如果我们退出应用的时候,Servic ...

  9. Android Small插件化框架解读——Activity注册和生命周期

    通过对嵌入式企鹅圈原创团队成员degao之前发表的<Android Small插件化框架源码分析>的学习,对Android使用的插件化技术有了初步的了解,但还是有很多需要认真学习的地方,特 ...

随机推荐

  1. SpringMVC(8)国际化

    在SpringMVC(七)格式化显示中我们讲了数据的格式化显示,Spring在做格式化展示的时候已经做了国际化处理,那么如何将我们网站的其它内容(如菜单.标题等)做国际化处理呢?这就是本篇要将的内容- ...

  2. Spring Boot中的那些生命周期和其中的可扩展点(转)

    前言可扩展点的种类Spring Boot启动过程 1.SpringApplication的启动过程 2.ApplicationContext的启动过程 3.一般的非懒加载单例Bean在Spring B ...

  3. GitHub 多人协作开发 三种方式(转)

    一.Fork 方式 网上介绍比较多的方式(比较大型的开源项目,比如cocos2d-x) 开发者 fork 自己生成一个独立的分支,跟主分支完全独立,pull代码后,项目维护者可根据代码质量决定是否me ...

  4. Java基础00-形参和返回值22

    1. 形参和返回值 1.1 类名作为形参和返回值 1.2 抽象类名作为形参和返回值 代码示例: 方法的形参是抽象类名 抽象动物类:定义了一个抽象的eat方法 动物的操作类:创建一个useAnimal方 ...

  5. [刘阳Java]_JdbcTemplate用法_第11讲

    JdbcTemplate模板提供操作数据库的方法应用,下面我们来说一下它的用法(注意:建议大家结合Spring API文档学习效果更好,因为下面的代码只是"抱砖引玉") 1. 遵循 ...

  6. 一、Java预科学习

    1.1.什么是计算机 计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能.是能够按照程序运行,自动.高速处理海量数据的现 ...

  7. 【剑指offer】22. 链表中倒数第k个节点

    剑指 Offer 22. 链表中倒数第k个节点 知识点:链表:双指针 题目描述 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点. 例 ...

  8. 微信小程序云开发-数据条件查询

    一.使用where条件查询 在.get()语句之前增加.where语句实现条件查询.  二.通过doc查询单条数据 1.使用doc来查询数据库中的单条数据 2.定义一个空对象,用来展示插叙到的单条数据 ...

  9. P5110 块速递推-光速幂、斐波那契数列通项

    P5110 块速递推 题意 多次询问,求数列 \[a_i=\begin{cases}233a_{i-1}+666a_{i-2} & i>1\\ 0 & i=0\\ 1 & ...

  10. Vulnhub -- Jarbas靶机渗透

    目标:拿到服务器的Shell 信息收集 配置好后用nmap扫描 kali's ip:192.168.241.131 nmap -sP 192.168.241.131/24 一个个扫描 发现192.16 ...