Android中Service生命周期

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

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

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

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

OK,用代码说话。

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

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
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的大部分函数,具体看注释

【转】Steve Yegge: Google面试秘籍

前言:

我搭建这个博客的初衷是自己写一些原创类型的博客,我非常不愿意去转一些网上大量存在的文章来造成信息冗余。但是,这篇文章我不得不保存下来,并十分愿意跟读者分享(如果有人在看的话),因为它代表了一位面试官的态度。

文章如下:

我憋了很长时间想写点关于去Google面试的秘籍。不过我总是推迟,因为写出来的东西会让你抓狂。很可能是这样。如果按统计规律来定义“你”的话,这文章很可能让你不爽。

为啥呢?因为啊……好吧,对此我写首小诗回答:

1
2
3
4
5
哎妈呀,俺咋听不懂涅
这个史蒂夫讲的都啥啊
要是俺老板也脚得他对
俺的工作就得玩儿完啦
哎妈呀,哎妈呀.....

你们感受一下。

Steve Yegge
(本文作者:Steve Yegge,业界大牛程序员,Google 员工)

当我还在别的公司,刚开始写点有关面试的东西的时候,我根本没有意识到会有上面这种典型的对面试秘籍的反应。不过很快我还是发现了。

看吧,大概的情况会是这样的:

我:blah blah blah, 我喜欢在面试里问X这个问题,blah blah blah…

你:X这个问题?哥们,我自打上大学就没听说过X!我的工作中也永远不需要用到它!他在面试里居然问这个?不过这说明那里有人觉得知道它很重要,而且,而且…我却不懂这个!如果他们发现了我在这方面的无知,不仅我会被现在的公司无情地扫地出门,而且那些喜欢问X问题的面试官也都会拒了我!如果人们都听信史蒂夫的话,那所有的面试官都不会招我了!我将无家可归,穷困潦倒!仅仅是因为我没有懂一些我之前永远用不上的东西!这太可怕了!我应该贬低X这个东西,除此之外我并不想先找本书仔细研究明白它再去否定它。显然我必须到处宣传史蒂夫是如何愚蠢,这样就没人会听他的了!

我:所以总体来说,blah blah… 嗯?你刚才说什么“扫地出门”?还有“穷困潦倒”?你在说什么啊?

你: 嗷!左一刀,右一刀,我刀刀不离你的后脑勺!

我: 好吧。我不会再谈面试的事了。

到底X是啥并不重要。它可能是任意一个概念。我可能会这么说:“在面试中向应聘者发问真的感觉好爽哦”,可是应聘者们还是会被吓坏了,因为他们对面试这档子事或者对于自己的名字缺乏安全感。但愿是前者吧。

可是,然后呢,随着时间流逝,面试者们来来去去,最后我们总是说:“天啊,我们真的希望刚才那位显然很聪明的应聘者对于面试准备得更好一点。我们有什么办法整点小秘籍来帮助未来的应聘者们呢?”

然后也没谁真的去做点什么,因为我们都害怕被某些不懂X概念的人给凶狠地砍上几刀。

我也考虑过只给出一套秘籍,里边就用类似于X这样的变量名而不是真正的主题,不过还是觉得在这样产生的真空状态下,每个人恐怕都会抓狂。不然的话,那个方法看起来还是挺不错的,只要我用一个假名发布它就好了。

最后,应聘者们真的需要一些秘籍,不管看秘籍的时候会有多么揪心。所以,与其绕弯子扯闲淡,我还不如实实在在地告诉你们一些具体的重要的X概念,还有不少有关面试准备的信息。

安装Genymotion模拟器全过程

今天在逛网站的时候,偶然看到一个号称“最火Android模拟神器”的Genymotion,它的特点简而言之就是秒开、方便、可与Eclipse相连——看介绍简直就是Android开发者的救星啊。

心动不如行动,马上动手搞起。在这里记录下安装与使用的全过程,介绍类的语言大家去网上找找,我这里只简单描述,力求以最短的时间上手使用。

一,下载Genymotion

进入官网,简单的注册一下。

在注册成功后网站会自动引导你进入下载页面(为网站的设计点赞,一点不拖泥带水!),我已经注册过,所以进入官网后点击下图中的按钮。进入下载页面。

进入下载页面后,有多个版本可供选择,大家选择自己对应的版本。注意一点是,Genymotion需要有Oracle VirtualBox的环境。因此,如果你恰好使用的是windows操作系统,那么恭喜你,选择图中标注的版本下载即可,该版本包含了Oracle VirtualBox。如果你使用的是其他操作系统,那么你应该选择其他版本,并且得先在电脑中安装Oracle VirtualBox(版本越高越好)。

二,安装Genymotion

软件安装过程不多表述,与一般的软件安装过程一致(我个人习惯是将安装目录从C盘改为D盘,不知道大家是否一样)。

安装完毕后默认运行。

进去后第一个界面是这样的,自动弹出增加一个模拟器(再次为用户体验点赞!这只是小细节,没啥技术难度,但是这样设计的好处无疑是非常方便新用户上手。)

Fork me on GitHub