前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[android] 采用服务执行长期后台的操作

[android] 采用服务执行长期后台的操作

作者头像
唯一Chat
发布于 2022-02-19 02:10:45
发布于 2022-02-19 02:10:45
29700
代码可运行
举报
文章被收录于专栏:陶士涵的菜地陶士涵的菜地
运行总次数:0
代码可运行

服务:在后台长期运行的没有界面的组件

新建一个类PhoneService类,继承系统的Service类

清单文件中 进行配置

新建一个节点<service>,设置名称android:name=”.PhoneService”

类里面有几个重要方法

onCreate()方法,服务被创建的时候调用

onDestory()方法,服务被销毁的时候调用

开启服务

获取intent对象,new Intent(this,PhoneService.class),参数:上下文,字节码

调用上下文对象的startService(intent),参数:intent对象

在服务的onCreate()方法里,执行一些长期操作

获取TelephoneyManager对象,调用getSystemService(TELEPHONY_SERVICE)方法

调用TelephoneyManager对象的listen(istener,events)方法,监听手机通话状态,参数:

PhoneStateListener对象,使用内部类类继承一下,要重写一些方法

PhoneStateListener.LISTEN_CALL_STATE

新建一个内部类MyPhoneStateListener继承PhoneStateListener,

重写方法onCallStateChanged(state,incomingNumber),当手机的电话状态变化的时候,回调此函数

在上面方法里面,switch判断一下通话状态,有以下三种TelephonyManager.CALL_STATE_IDLE空闲状态,TelephonyManager.CALL_STATE_RINGING响铃状态,

TelephonyManager.CALL_STATE_OFFHOOK通话状态

需要权限android.permission.READ_PHONE_STATE

MainActivity.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.tsh.listentel;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends Activity {

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

PhoneService.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.tsh.listentel;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class PhoneService 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 MyPhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE);
    }
    //内部类
    private class MyPhoneStateListener extends PhoneStateListener{

        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            switch (state) {
            case TelephonyManager.CALL_STATE_IDLE:
                System.out.println("空闲状态");
                break;
            case TelephonyManager.CALL_STATE_RINGING:
                System.out.println("响铃状态");
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                System.out.println("通话状态");
                break;
            default:
                break;
            }
        }
        
    }
    //服务销毁
    @Override
    public void onDestroy() {
        System.out.println("服务销毁");
        super.onDestroy();
    }

}

Manifest.xml 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tsh.listentel"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="23" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

    <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=".PhoneService"></service>
    </application>

</manifest>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-03-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
jvm(1):jvm内存模型
身为一个职业的Java程序员,每天打交到最多的就是jvm,那么套用孙子的一句话“知己知彼方能百战不殆”,熟悉jvm也就意味着是我们进阶路上必过之槛,下面先来张图,大概说明下jvm的内存分布
yiduwangkai
2019/09/17
8330
jvm(1):jvm内存模型
JVM 工作原理和流程
转载自 https://blog.csdn.net/qq_33384065/article/details/80282023
allsmallpig
2021/02/25
8230
jvm原理——第一篇jvm的运行模式
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行,属于用户态。
胡齐
2019/12/19
1.4K0
jvm原理——第一篇jvm的运行模式
面试官:说说JVM内存整体结构?
Java 虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程一一对应的数据区域会随着线程开始和结束而创建和销毁。
鲁大猿
2024/01/04
2210
面试官:说说JVM内存整体结构?
20张图助你了解JVM运行时数据区,你还觉得枯燥吗?
我们的JVM系列已经断更好几天了,小伙伴们在后台疯狂私信阿Q,想看后续内容,今天它来了。相信大家在上篇文章中已经对类加载子系统有了清晰的认识,接下来就让我们来揭开“运行时数据区”的神秘面纱吧。(文章可能有点长,建议先收藏一波)
阿Q说代码
2021/05/13
6720
20张图助你了解JVM运行时数据区,你还觉得枯燥吗?
Java内存区域有哪些构成?
Java 内存区域, 也叫运行时数据区域、内存区域、JVM内存模型,和 Java 虚拟机(JVM)的运行时区域相关,是指 JVM运行时将数据分区域存储,强调对内存空间的划分。 经常与Java内存模型(JMM)混淆,其定义了程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。 JVM并不是只有唯一版本的,在Java发展历史中,有许多优秀的Java虚拟机,其中目前大家最熟悉的就是HotSpot虚拟机,什么你不知道?
Jensen_97
2023/07/19
3570
Java内存区域有哪些构成?
聊聊对JVM内存结构的理解吧
JDK 1.8 同 JDK 1.7 比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对 JVM 规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。
每周聚焦
2023/05/17
3590
深入理解JVM及基础面试题分析(结合多个经典博客综合整理)
根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。
葆宁
2019/04/18
6340
深入理解JVM及基础面试题分析(结合多个经典博客综合整理)
JVM是如何分配管理内存的?
本文成文参考了《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》和《Java虚拟机规范(Java SE 8版)》,这是两本难得的好书,推荐大家购买实体书籍,后续会考虑在"借书下饭"栏目下开设子专栏,如果需要电子版尝鲜可以关注后私信我。
一头小山猪
2020/04/27
1.2K0
JVM是如何分配管理内存的?
一文解析JVM的内存结构,还不弄懂JVM怎么行
Jvm的内存结构是由《java虚拟机规范》制定的,《java虚拟机规范》只负责制定标准,具体的实现多种多样,比如:sun公司的HotSpot、BEA的JRockit、IBM的J9(前两个目前都已被Oracle收购),另外Apache、Google、微软等组织或公司都有自己的java虚拟机实现。只是我们目前开发比较常用的是HotSpot。
慕容千语
2021/03/03
5610
一文解析JVM的内存结构,还不弄懂JVM怎么行
Java虚拟机工作原理详解
http://blog.csdn.net/bingduanlbd/article/details/8363734
bear_fish
2018/09/20
4820
Java虚拟机工作原理详解
Java虚拟机--虚拟机内存区域Java虚拟机内存区域
Java虚拟机内存区域 Java程序在JVM虚拟机中运行,当我们一个类被加载到虚拟机中时,JVM会给该类分配具体的内存空间/内存地址,而这被分配的区域就是Java虚拟机运行时内存区域。那么,该片区域到底有什么,又可以做什么,接下来就来一一解答。 在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: 首先是我们的编写的Java源代码文件---xxx.java,该文件会被Java编译器编译成字节码文件---xxx.class,然后Java虚拟机开始启动,Java虚拟机通过类加载器加载xxx.cl
贾博岩
2018/05/11
2.1K0
Java内存区域
对于c++选手来说, 内存管理是一项基本功,因为c++没有自带的管理技术, 所以c++开发人员需要自己对实现的所有代码进行内存管理。 虽然说Java实现了一套自己的内存管理机制, 这让Java程序员可以全心投入到需求开发中去, 不需要对内存做太多了的了解。 但是问题也正是出现在这里, 因为不知道虚拟机是怎么使用内存的,所以出了问题也是无从下手,不知道具体哪里出了问题。 所以这些都是我们Java程序员需要了解和掌握的内存管理技术的原因。
用户11097514
2024/05/31
1710
Java内存区域
深入浅出Java中JVM内存管理
Java岗位面试,JVM是对程序员基本功考察,通常会问你对JVM了解吗? 可以分几部分回答这个问题,首先JVM内存划分 | JVM垃圾回收的含义 | 有哪些GC算法 以及年轻代和老年代各自特点
java思维导图
2018/10/08
5120
深入浅出Java中JVM内存管理
Java虚拟机内存管理(一)—内存划分
Java 虚拟机作为运行 Java 程序抽象出来的计算机,具有内存管理的能力,像内存分配、垃圾回收等这些相关的内存管理问题,Java 虚拟机都会帮我们解决,所以作为一个 Java 程序员要比 C++ 程序员幸福,但是内存方面一旦出现问题,如果对虚拟机怎样使用内存不了解,就很难排查错误。
Wizey
2018/09/29
8830
Java虚拟机内存管理(一)—内存划分
【JVM进阶之路】二:Java内存区域
Java 虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。
三分恶
2021/04/01
3580
【JVM进阶之路】二:Java内存区域
java内存分配和String类型的深度解析
在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题。下面是本文将要涉及到的一些问题,如果读者对这些问题都了如指掌,则可忽略此文。
哲洛不闹
2018/09/19
7400
java内存分配和String类型的深度解析
架构师之路--从原理角度来分析性能
  埃及艳后Cleopatra,很小的时候看过妈妈买的一本书里把她的名字翻译成克娄巴特拉,里面有很多描写她美貌的场景描写。然而这个以美貌著称的奇女子,我看到书里,凯撒和安东尼真正倾心的是Cleopatra背后的埃及文明及Cleopatra的智慧。罗马是个好战的国家,人民没有很多的精力去创造各种文明和手工艺品。而Cleapatra在这些大佬面前的出场,总结两个字:“华丽”。这种华丽会让罗马这些篡位的暴发户首领眼前一亮。在柏林,有全世界最好的艳后肖像。她的头发结的是个简单的发髻,风格朴实,鼻子是稍有点长的鹰钩鼻,嘴也算不上性感,没有耳环,没有项链。并非一个性感尤物的相貌。我可以理解。可以理解她坐在金碧辉煌的豪华大船的中央,穿着绚丽,体态骄傲而高贵,旁边是面貌平常的修女来反衬她的美,那是政治。而留给后人的肖像,作为一个女孩子更想让人记住的,是更内在本质的东西。古代资料记载,她聪明,诙谐,精通多种语言,喜爱学习和阅读,还有惊人的毅力。后人评价说:“如果Cleopatra的鼻子再塌一点,世界的面貌将会改变。” 我想,其实智慧才是她最可贵的资产。
静儿
2018/07/24
3640
Java多线程-带你认识Java内存模型,内存分区,从原理剖析Volatile关键字
地址:https://juejin.im/post/59f8231a5188252946503294
用户2802329
2018/08/07
4440
Java多线程-带你认识Java内存模型,内存分区,从原理剖析Volatile关键字
面试:精通Java;面试官:来讲一下JVM虚拟机内存模型的最底层原理,必须说详细说清楚,知其所以然。看完后,你还敢在简历上写精通Java吗?
精通Java?来看看下面这些底层中的底层原理你是否知道吧。 提到JVM必不可少的就得谈到它的内存模型,根据 JVM 规范,JVM 内存共分为虚拟机栈VM stack、堆heap、方法区Method Area、程序计数器Program Counter Register、本地方法栈Native Method Stack五个部分。如下图,咋们分别对这五个区域进行详细的原理讲解。(为节省读者的时间,方便大家理解记忆,笔者把全部知识点分层分段,用较短的语言去描述,言简意赅,句句都是重点。)
全栈程序员站长
2022/08/26
3650
面试:精通Java;面试官:来讲一下JVM虚拟机内存模型的最底层原理,必须说详细说清楚,知其所以然。看完后,你还敢在简历上写精通Java吗?
推荐阅读
相关推荐
jvm(1):jvm内存模型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验