day08 服务
1 进程的概念
// [1]获取teltphonemanager的实例
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
/ [2]注册电话的监听
tm.listen(new MyPhoneStateListener(),
PhoneStateListener.LISTEN_CALL_STATE);
// 定义一个类用来监听电话的状态
private class MyPhoneStateListener extends PhoneStateListener {
// 当电话设置状态发生改变的时候调用
@Override
public void onCallStateChanged(int state, String incomingNumber) {
// [3]具体判断一下电话的状态
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:// 空闲状态
if(recorder!=null){
recorder.stop();
recorder.reset(); // You can reuse the object by going back to
// setAudioSource() step
recorder.release(); // Now the object cannot be reused
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK:// 接听状态
System.out.println("开始录音");
recorder.start(); // Recording is now started
break;
case TelephonyManager.CALL_STATE_RINGING:// 响铃状态
System.out.println("准备录音机");
try {
//[1]创建MediaRecorder实例
recorder = new MediaRecorder();
//[2]设置音频的来源
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//[3]设置输出的格式
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//[4]设置音频的编码方式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//[5]设置存放的路径
recorder.setOutputFile("/mnt/sdcard/luyin.3gp");
//[6]准备录
recorder.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
super.onCallStateChanged(state, incomingNumber);
}
}
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.RECORD_AUDIO"/>
package com.phone.phonelistener;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//服务开启
Intent intent1 = new Intent(context,PhoneService.class);
context.startService(intent1);
}
}
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".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="com.phone.phonelistener.PhoneService"></service>
<receiver android:name="com.phone.phonelistener.BootReceiver">
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
package com.phone.registerbroadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class ScreenReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取当前事件类型
String action = intent.getAction();
if("android.intent.action.SCREEN_OFF".equals(action)){
System.out.println("说明屏幕锁屏了");
}else if("android.intent.action.SCREEN_ON".equals(action)){
System.out.println("说明屏幕解屏了");
}
}
}
package com.phone.registerbroadcast;
import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
public class ScreenService extends Service {
private ScreenReceiver receiver;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
//[1]创建ScreenReceiver实例
receiver = new ScreenReceiver();
//[2]获取IntentFilter 实例 目的是添加action
IntentFilter filter = new IntentFilter();
//[3]动态添加action
filter.addAction("android.intent.action.SCREEN_OFF");
filter.addAction("android.intent.action.SCREEN_ON");
//[4]注册服务
registerReceiver(receiver, filter);
super.onCreate();
}
@Override
public void onDestroy() {
unregisterReceiver(receiver);
super.onDestroy();
}
}
package com.phone.registerbroadcast;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this,ScreenReceiver.class);
startService(intent);
}
}
<service android:name="com.phone.registerbroadcast.ScreenService"></service>
package com.phone.ban;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.widget.Toast;
public class BanZhangService extends Service {
//把定义的中间人对象返回
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
public void banZhang(int money) {
if(money > 1000){
Toast.makeText(getApplicationContext(), "我是领导 把证给你办了", 1).show();
}else{
Toast.makeText(getApplicationContext(), "这点钱还想办事....", 1).show();
}
}
//[1]定义中间人对象
public class MyBinder extends Binder{
public void callBanZheng(int money){
//调用办证方法
banZhang(money);
}
}
}
package com.phone.ban;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import com.phone.ban.BanZhangService.MyBinder;
public class MainActivity extends Activity {
private MyConn conn;
private MyBinder myBinder;//定义的中间人对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this,BanZhangService.class);
//绑定服务
conn = new MyConn();
bindService(intent, conn, BIND_AUTO_CREATE);
}
//点击按钮调用服务里办证的方法
public void click(View v){
myBinder.callBanZheng(1001);
}
//监视服务的状态
private class MyConn implements ServiceConnection{
//当服务连接成功调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
@Override
protected void onDestroy() {
//当activity销毁的时候解绑服务
unbindService(conn);
super.onDestroy();
}
}
myBinder = (Iservice) service;
package com.phone.baidumusic;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.view.View;
public class MainActivity extends Activity {
//中间人对象
private IService iService;
private MyConn conn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//混合方式开启服务
//[1]先调用startservice 目的是可以保证服务在后台长期运行
Intent intent = new Intent(this, MusicService.class);
startService(intent);
//[2]调用bindservice 目的为了获取我们定义的中间人对象 就可以间接的调用服务里面的方法了
conn = new MyConn();
bindService(intent, conn, BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
//当Activity销毁的时候 解绑服务
unbindService(conn);
super.onDestroy();
}
//点击按钮 播放音乐
public void click1(View v){
iService.callPlayMusic();
}
//点击按钮 暂停音乐
public void click2(View v){
iService.callPauseMusic();
}
//点击按钮 继续播放音乐
public void click3(View v){
iService.callRePlayMusic();
}
//监听服务的状态
private class MyConn implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iService = (IService) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
}
package com.phone.baidumusic;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.view.View;
public class MusicService extends Service {
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
}
// 播放音乐
public void playMusic() {
// TODO 等讲完多媒体 再完善该案例
System.out.println("音乐播放了");
}
// 暂停音乐
public void pauseMusic() {
// TODO 等讲完多媒体 再完善该案例
System.out.println("音乐暂停了");
}
// 继续播放音乐
public void rePlayMusic() {
// TODO 等讲完多媒体 再完善该案例
System.out.println("音乐继续播放了");
}
// [1]在服务的内部定义一个中间对象(IBinder)
private class MyBinder extends Binder implements IService{
@Override
public void callPlayMusic() {
playMusic();
}
@Override
public void callPauseMusic() {
pauseMusic();
}
@Override
public void callRePlayMusic() {
rePlayMusic();
}
}
}
package com.phone.baidumusic;
public interface IService {
public void callPlayMusic();
public void callPauseMusic();
public void callRePlayMusic();
}
<service android:name="com.phone.baidumusic.MusicService"></service>
day08 服务的更多相关文章
- day08.4-samba共享网盘服务
1. 安装软件:yum install samba -y 2. 新建共享目录物理路径:mkdir /zizaijiapu 修改配置文件:vim /etc/samba/smb.con ...
- day08.3-apache网页服务
1. 安装软件:yum install httpd -y 2. 查看配置文件:vim /etc/httpd/conf/httpd.cof,其中,"Listen 80&qu ...
- day08.2-ssh远程连接服务
在Linux环境中,部署一个服务的一般步骤: a). 准备环境,包括 关闭防火墙:service iptables stop(或chkconfig iptables off) 关闭se ...
- Python面向对象进阶和socket网络编程-day08
写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __i ...
- HTTP协议基础与web服务的重定向,跳转以及请求转发
JavaWeb中,HttpServletRequest与HttpServletResponse几乎是处理各种请求与操作必备的参数,与原始的ServletRequest/ServletResponse相 ...
- day08:软件系统的体系结构&Tomcat详解&Web应用&http协议
day08 软件系统体系结构 常见软件系统体系结构B/S.C/S 1.1 C/S C/S结构即客户端/服务器(Client/Server),例如QQ: 需要编写服务器端程序,以及客户端 ...
- python开发学习-day08(socket高级、socketserver、进程、线程)
s12-20160305-day08 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...
- Dubbo学习系列之六(微服务架构实战)
看了最近文章的反馈,似乎波澜不惊的样子,应该是看官觉得都是小菜,那我就直上硬菜,人狠话不多,开始!准备:Idea201902/JDK11/ZK3.5.5/Gradle5.4.1/RabbitMQ3.7 ...
- 阶段5 3.微服务项目【学成在线】_day08 课程图片管理 分布式文件系统_06-分布式文件系统研究-fastDFS安装及配置文件说明
3 fastDFS入门 3.1fastDFS安装与配置 3.1.1 导入虚拟机 对fastDFS的安装过程不要求学生掌握,可以直接导入老师提供虚拟机. 1.使用Vmware打开虚拟机配置文件“Cent ...
随机推荐
- Java线程池 / Executor / Callable / Future
为什么需要线程池? 每次都要new一个thread,开销大,性能差:不能统一管理:功能少(没有定时执行.中断等). 使用线程池的好处是,可重用,可管理. Executor 4种线程 ...
- Android性能优化-内存优化
原文链接 Manage Your App’s Memory 前言 在任何软件开发环境中,RAM都是比较珍贵的资源.在移动操作系统上更是这样,因为它们的物理内存通常受限.尽管在ART和Dalvik虚拟机 ...
- 解决 Firefox 下载文件名乱码扩展 ReDisposition
作者 muzuiget 发布 2013-03-13 19:23 标签 redisposition Firefox 下载文件名乱码问题由来已久,偶然一两次还可以手动改名,批量下载时简直要亲命,最终我 ...
- 审核流(1)SNF.WorkFlow审核流简介--SNF快速开发平台3.1
本项目是的在Spring.Net.Framework 平台之上进行研发.SNF.WorkFlow审核流是一款完全自主知识产权研发的为软件项目. 审核流基本概念:什么是审核流? 审核流:两个或两个以上的 ...
- CentOS7安装chrony替代ntp同步时间
Chrony是一个开源的自由软件,它能保持系统时钟与时钟服务器(NTP)同步,让时间保持精确.它由两个程序组成:chronyd和chronyc:chronyd是一个后台运行的守护进程,用于调整内核中运 ...
- JS控制音频顺序播放
做一项目,用到“叫号功能”,网页上有一“叫号”按钮,点击后就读数据库中存的号码,如123号, 然后就发声音出来, 思路是网上下载0123456789的叫号声音,然后按钮点击事件里就在JS里写用那个HT ...
- golang slice
golang 在for range一个slice时,会读出其cap长度.在for的过程中,即使动态append该slice,最终for也会在第一次读取的cap长度处停止. package main i ...
- ES Grafana
https://github.com/trevorndodds/elasticsearch-metrics https://grafana.com/dashboards/878 https://gra ...
- C++11 列表初始化
在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,比如说对于一个数组我们可以使用 int arr[] = {1,2,3}的方式初始化,又比如对于一个简单的结构体: ...
- IIS发布的网站常见的问题汇总
1.安装.NET4.0时缺少WIC导致不能装上.NET4.0,下载安装后即可,下载地址如下,根据系统版本选择对应软件 32位版:https://www.microsoft.com/zh-cn/down ...