Android中Service生命周期

这几天面试的时候,反复被问到一个关于Service的问题。

之前做了一个APP。有一个应用场景是,需要开机启动一个Service,在Service中另开一个线程,去对比用户配置中的时间,作出及时提醒。

然后面试的时候在描述该做法时就被问到一个问题,如果Service被系统或者其他应用kill了怎么办?我当时的回答是,在onDestroy中去处理。面试官说,onDestroy并不会被调用。

面试的详情暂且不表,在后期会专门写面经。现在讨论这个问题,Service被kill后生命周期是怎样的。

OK,用代码说话。

1,新建一个项目,项目中有一个Activity,一个Service。在Activity的button的监听处理中去开启这个Service

MainActivity.java

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

package
com.zhenghuiy.killedservicelifecycletest;

import android.os.Bundle;

import android.app.Activity;

import android.content.Intent;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

public
class MainActivity extends
Activity implements
OnClickListener{

    private
Button startServiceBtn;

    

    @Override

    protected
void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        initViews();

    }

    private
void initViews() {

        startServiceBtn = (Button) findViewById(R.id.startService);

        startServiceBtn.setOnClickListener(this);

    }

    @Override

    public
void onClick(View view) {

        if(view.getId() == R.id.startService){

            Intent intent = new
Intent();

            intent.setClass(this, MyService.class);

            this.startService(intent);

        }

            

        

    }

}

  

 

2,重写Service的大部分函数,具体看注释

MyService.java

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

package
com.zhenghuiy.killedservicelifecycletest;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.util.Log;

public class MyService extends
Service implements
Runnable{

    /*

     * Service当以bindService的形式调用时,会调用onBind

     * 当以startService,则调用onStartCommand

     * 另外,onBind是一个抽象函数,必须重写

     * */

    

    @Override

    public
int onStartCommand(Intent intent, int
flags, int
startId) {

        showLog("onStartCommand is called");

        

        //Service运行在UI主线程,为了避免因堵塞而被关闭,另开一个线程

        new
Thread(this).start();

        

    

        return
super.onStartCommand(intent, flags, startId);

    }

    @Override

    public
IBinder onBind(Intent itent) {

        showLog("onBind is called");

        return
null;

    }

    @Override

    public
void onCreate() {

        super.onCreate();

        showLog("onCreate is called");

    }

    @Override

    public
void onDestroy() {

        super.onDestroy();

        showLog("onDestroy is called");

    }

    /*

     * onStart方法已经过时

     * 在2.0之后的版本使用onStartCommand

     * */

    @Override

    @Deprecated

    public
void onStart(Intent intent, int
startId) {

        super.onStart(intent, startId);

        showLog("onStart is called,the Intent action is"+intent.getAction());

    }

    @Override

    public
void onTaskRemoved(Intent rootIntent) {

        super.onTaskRemoved(rootIntent);

        showLog("onTaskRemoved is called,the Intent action is"+rootIntent.getAction());

    }

    @Override

    public
void onTrimMemory(int
level) {

        super.onTrimMemory(level);

        showLog("onTrimMemory is called,the level is"+level);

    }

    

    private
void showLog(String text){

        Log.v(this.getClass().getName(),text);

    }

    @Override

    public
void run() {

        while(true){}

    

    }

}

  

3,用真机测试

运行后点击button,启动service,此时以下函数被调用:

点击home回到手机桌面,此时该Service仍然在后台运行。onTrimMemory被调用

我使用的手机是华为3C。进入系统的setting后,可以看到显示该应用有一个进程和一个服务在运行中。

在设置里的应用管理那点击“停止”。onDestroy被调用

说明,当服务被系统自动或手动(人为的在设置里停止)停止时,仍然会正常走完其生命周期。

4,测试使用其他应用,比如“腾讯手机管家”去停止Service.

前面同样的过程就不赘述,当Service在后台运行的时候,使用手机管家去“一键加速”。

可以在设置——》应用管理
里看到,原来该测试应用的item显示“有1个进程和1个服务在运行”变成“有0个进程和1个服务在运行”。再刷新一遍,就发现,该应用已经不在运行中的列表里了。

并且,logcat里始终没有打印“onDestroy is called”.

结论是,其他“管家式”应用“清理”的方法是,直接kill该进程。此时,Service不会走正常的生命周期,也就是onDestroy未被调用。

5,回到问题本身

当时面试官问Service的onDestory并不会被调用,此时你要如何解决。我的回答是:

一种方法是,使用服务器进行推送。如果客户端有响应,说明Service存活。如果没有响应,就启动Service.

另一种方法是,将该Service独立出来,运行在另一个进程中。(但是仔细想想,这个方法并不能避免Service被kill,因此不算正确答案)。

不知道其他方法还有什么?

Android中Service生命周期,布布扣,bubuko.com

时间: 2024-10-17 07:45:42

Android中Service生命周期的相关文章

Android 中Service生命周期

使用context.startService() 启动Service 其生命周期为context.startService() ->onCreate()- >onStart()->Service running-->context.stopService() | ->onDestroy() ->Service stop 如果Service还没有运行,则android先调用onCreate()然后调用onStart():如果Service已经运行,则只调用onStart(

Android中进程生命周期的优先级

“我们不是生产者,我只是大自然的搬运工.” 学习Android最好的途径当然是强大的官方文档了,其中在Processes and Threads一节中对于进程生命周期淘汰优先级,有着详细的介绍.原文如下: Process lifecycle The Android system tries to maintain an application process for as long as possible, but eventually needs to remove old processes

android中的生命周期(新增2个函数)

onPostOnCreate()和OnPostResme()这两个函数 onPostResume() Called when activity resume is complete (after onResume has been called). Applications will generally not implement this method; it is intended for system classes to do final setup after application

Android中bindService的使用及Service生命周期

Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯bindService的使用,不涉及任何startService方法调用的情况.如果想了解startService相关的使用,请参见<Android中startService的使用及Service生命周期>. bindService启动服务的特点 相比于用startService启动的Service,bindService启动的服务

Android Service生命周期及用法

Service概念及用途:Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,那 我们什么时候会用到Service呢?比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当我们退出播放音乐的应用,如果不用Service,我 们就听不到歌了,所以这时候就得用到Service了,又比如当我们一个应用的数据是通过网络获取的,不同时间(一段时间)的数据是不同的这时候我们可以 用S

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

1.Service的生命周期         Android中的Service(服务)与Activity不同,它是不能和用户交互,不能自己启动的,运行在后台的程序,如果我们退出应用的时候,Service进程并没有结束,它仍然在后台运行,那我们什么时候用到Service呢?比如我们播放音乐时,有可能想边听音乐边干些其他事情,当我们退出音乐播放应用,如果不用Service,我们就听不到音乐了,所以这个时候我们就要用到Service了,又比如当我们一个应用的数据的通过网络获得.不同时间(一段时间)的数

Android进程的生命周期

Android系统想要永久的保留一个应用进程几乎是不可能的,所以系统就需要不断的释放老的或者不太重要的进程以便腾出足够的内存空间来运行新的或者更重要的进程,那么系统如何决定哪个进程应该保留哪个应该杀死呢,原来系统会根据进程中运行组件以及他们的状态列出一个"重要层级",当内存出现紧张的时候,系统会首先杀死最不重要的进程,接着是第二个,第三个...,以此类推来不断的释放系统资源直到内存不再紧张为止. 根据这个重要层级系统把进程分为了5个级别,下面要说的就是这五种不同的进程类型: 1.for

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

< Service具体解释(一):什么是Service> < Service具体解释(二):Service生命周期> <Service具体解释(三):Service的使用> <Service具体解释(四):绑定服务 与 通信> <Service具体解释(五):使用Messager进行通信> <Service具体解释(六):进程间通信-AIDL> 与Activity相似,Service也有自己的生命周期函数,在不同的时刻.系统会调用相应

Android中Service的详细解释与使用

Android中Service的详细解释与使用: 概念: (1).Service可以说是一个在后台运行的Activity.它不是一个单独的进程,它只需要应用告诉它要在后台做什么就可以了. (2).它要是实现和用户的交互的话需要通过通知栏或者是通过发送广播,UI去接收显示. (3).它的应用十分广泛,尤其是在框架层,应用更多的是对系统服务的调用. 作用: (1).它用于处理一些不干扰用户使用的后台操作.如下载,网络获取.播放音乐,他可以通过INTENT来开启,同时也可以绑定到宿主对象(调用者例如A