1. 为什么使用service

应用程序 : 一组组件(activity  service provider receiver)的集合.

一般情况 一个应用程序 会对应一个进程.

一般情况 关闭掉应用,  (关闭掉所有的界面 , 关闭所有的activity).

应用程序的进程 是不会被关闭掉的 仍然在后台长期的运行.

采用一组策略 帮助我们自动的管理进程.

进程 按照优先级分为不同的等级:

(1. 前台进程  用户可以看到这个进程里面某一个activity的界面. 可以操作这个界面

(2. 可见进程  用户仍然可以看到这个进程 某个activity的界面 ,但是 不可以操作这个界面

(3. 服务进程  如果一个应用程序 有一个服务在后台运行

(4. 后台进程  没有任何服务的进程 打开一个activity 之后 按了home键 最小化

(5. 空进程    没有任何活动组件 存在的进程.

2. 示例: 服务开启一个电话监控器

MainActivity.java 开启服务

public class MainActivity extends Activity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //开启服务
Intent intent = new Intent(this,PhoneStatusService.class);
startService(intent);
}
}

PhoneStatusService.java 服务代码 继承自Service

public class PhoneStatusService extends Service {
/**
* 长期在后台运行的组件,如果用户不手动的关闭 , 不会停止的.
*/
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
} @Override
public void onCreate() {
super.onCreate();
System.out.println("服务被创建了 ");
// 监视用户电话状态的变化...
// 电话管理器 电话管理的服务
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
// 监听手机的通话状态的变化
tm.listen(new MyPhoneStatusLinstener(),
PhoneStateListener.LISTEN_CALL_STATE); } private class MyPhoneStatusLinstener extends PhoneStateListener {
private MediaRecorder recorder; @Override
public void onCallStateChanged(int state, String incomingNumber) {
try {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE: // 空闲状态 ,没有通话 没有响铃
if (recorder != null) {
recorder.stop();
recorder.reset(); // You can reuse the object by going back
recorder.release(); // Now the object cannot be reused
recorder = null;
} break;
case TelephonyManager.CALL_STATE_RINGING: // 响铃状态.
System.out.println("发现来电号码 :" + incomingNumber);
// 1.创建出来一个录音机
recorder = new MediaRecorder();
// 设置录制的音频源 从话筒里面获取声音
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile("/sdcard/" + System.currentTimeMillis()
+ ".3gp");
recorder.prepare(); break;
case TelephonyManager.CALL_STATE_OFFHOOK: // 通话状态
if (recorder != null) {
recorder.start(); // Recording is now started
}
break;
}
} catch (Exception e) {
e.printStackTrace();
} super.onCallStateChanged(state, incomingNumber);
} } @Override
public void onDestroy() {
super.onDestroy();
System.out.println("服务被销毁了...");
} }

AndroidManifest.xml 注册服务 和 所需权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itheima.callstatuslintener"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.itheima.callstatuslintener.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".PhoneStatusService"></service>
</application> </manifest>

Android -- service 服务的创建与使用,生命周期,电话监控器的更多相关文章

  1. Android服务Service具体解释(作用,生命周期,AIDL)系列文章-为什么须要服务呢?

    Android服务Service具体解释(作用,生命周期,AIDL) 近期沉迷于上班,没有时间写博客了.解衣入睡,未眠.随起床写一篇博客压压惊! ##我们android系统为什么须要服务Service ...

  2. Android Service 服务

    一. Service简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟Activi ...

  3. Android Service 服务(一)—— Service .

    http://blog.csdn.net/ithomer/article/details/7364024 一. Service简介 Service是android 系统中的四大组件之一(Activit ...

  4. Android Service 服务(三)—— bindService与remoteService

    (转自:http://blog.csdn.net/ithomer/article/details/7366396)   一.bindService简介 bindService是绑定Service服务, ...

  5. C# Windows Service服务的创建和调试

    前言 关于Windows服务创建和调试的文章在网络上的很多文章里面都有,直接拿过来贴在这里也不过仅仅是个记录,不会让人加深印象.所以本着能够更深刻了解服务项目的创建和调试过程及方法的目的,有了这篇记录 ...

  6. Service的两种用法及其生命周期

    先来一点基础知识: Service 是android的四大组件之一,与Activity同属于一个级别,它是运行在后台进行服务的组件(例如在后台播放的音乐,播放音乐的同时并不影响其他操作).Servic ...

  7. 17.(转) Android之四大基本组件介绍与生命周期

    Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity ...

  8. android拾遗——四大基本组件介绍与生命周期

    Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity ...

  9. Android SDK上手指南:Activity与生命周期

    Android SDK上手指南:Activity与生命周期 2013-12-26 15:26 核子可乐译 51CTO 字号:T | T Activity生命周期并不仅仅在用户运行应用程序之后才开始生效 ...

随机推荐

  1. java中生成流水号的一个例子(使用关系型数据库)

    在实际的开发中,可能会有根据一定的规则生成流水号的需求(比如根据根据公司编码和日期生成4位流水号)我们可以把公司和日期联合起来作为一个业务编码,把这个业务编码和序列的值存储到数据库中,每次需要生成流水 ...

  2. windows 下,go语言 交叉编译

    http://bbs.csdn.net/topics/390601048 参考上面的操作

  3. windowSoftInputMode

    有个问题困扰我一晚上,每次进入Activity后,EditText自动获得焦点弹出软键盘,键盘遮挡listView,使得无法显示最后一条消息.我在edittext点击事件中也设定了,listView. ...

  4. applicationContext.xml的文件位置就可以有两种默认实现

    ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息.因为它实现了ServletContextListener这个接口,在web ...

  5. EDT改成CST

    功能说明:显示文字.语 法:echo [-ne][字符串]或 echo [--help][--version]补充说明:echo会将输入的字符串送往标准输出.输出的字符串间以空白字符隔开, 并在最后加 ...

  6. Linux系列-Xshell连接本地VMware安装的Linux虚拟机

    一.安装VMwareWorkstation并安装RedHat虚拟机,这里安装步骤省略,网络的资料很多,大侠们不如百度或者谷歌一下,大把的资料. 二.打开本地电脑的“网络连接”,你会发现多出了2个网络适 ...

  7. Css-常用css初始化

    /*PC初始化*/ * {;;; } body, html { width: 100%; height: 100%; min-width: 1024px; } body { font-size: 14 ...

  8. Linux设置程序开机启动-tomcat开机启动

    假设我有一个tomcat应用需要开机启动. 前提你的JAVA环境变量已经配置好没有问题,检测方法如图 然后找到tomcat的目录,我的目录是 /home/yuqing_4.0/tomcat_share ...

  9. talib 中文文档(十四):Math Transform Functions 数学变换

    Math Transform Functions ACOS - Vector Trigonometric ACos 函数名:ACOS 名称:acos函数是反余弦函数,三角函数 real = ACOS( ...

  10. matplotlib-折线图、散点图

    (一)折线图小结 1.设置图片大小(想要一个高清无码大图) # 图大小 plt.figure(figsize=(20, 8), dpi=80) 2.保存到本地 # 设置图片大小 plt.figure( ...