Android 基础回顾:Service 基础

【Android基础回顾】五:AMS(Activity Manager Service) Android 的 AMS(Activity Manager Service)是 Android 系统中的核心服务之一,负责管理整个应用生命周期、任务栈、进程和四大组件(Activity、Service、BroadcastReceiver、ContentProvider)的运行。它运行在系统进程 system_server 中,是 Android Framework 层的关键服务。 阅读详情

Service 主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务。必要的时候我们甚至可以在程序退出的情况下,让 Service 在后台继续保持运行状态。相对于使用线程来实现异步任务的方式,它的安全性更高。(但是 Service 是运行在主线程中的,如果需要实现异步任务,可以单开线程。)

1、基础使用示例

1.1 使用示例

首先,通过继承 Service 来定义 Service:

    public class MyService extends Service {

        public static final String TAG = "MyService";

        @Override
        public void onCreate() {
            super.onCreate();
            Log.d(TAG, "onCreate() executed");
        }

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.d(TAG, "onStartCommand() executed");
            return super.onStartCommand(intent, flags, startId);
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            Log.d(TAG, "onDestroy() executed");
        }

        @Override
        public IBinder onBind(Intent intent) {
            return new MyBinder();
        }

        class MyBinder extends Binder {  
            public void startDownload() {  
                Log.d("TAG", "startDownload() executed");  
            }   
        }  
    }

定义了 Service 之后还要在 AndroidManifest.xml 中注册才能正常使用:

    <service android:name="com.example.servicetest.MyService"/>  

然后,就可以使用该 Service 了:

    // 启动 Service
    Intent startIntent = new Intent(this, MyService.class);
    startService(startIntent);  

    // 停止 Service
    Intent stopIntent = new Intent(this, MyService.class);
    stopService(stopIntent);

    // 关联 Service 和 Activity
    Intent bindIntent = new Intent(this, MyService.class);  
    bindService(bindIntent, connection, BIND_AUTO_CREATE);

    // 解除 Service 和 Activity 关联
    unbindService(connection);

    private ServiceConnection connection = new ServiceConnection() {  
  
        @Override  
        public void onServiceDisconnected(ComponentName name) { /* Do nothing. */ }  
  
        @Override  
        public void onServiceConnected(ComponentName name, IBinder service) {  
            myBinder = (MyService.MyBinder) service;  
            myBinder.startDownload();  
        }  
    };

以上就是 Service 的基础使用示例。

1.2 Service 的使用小结

首先是 Service 的生命周期图
Service的生命周期图
其他,

  1. Service 有绑定模式和非绑定模式,以及这两种模式的混合使用方式。不同的使用方法生命周期方法也不同。
    1. 非绑定模式:当第一次调用 startService() 的时候执行的方法依次为 onCreate()->onStartCommand();当 Service 关闭的时候调用 onDestory()。
    2. 绑定模式:第一次 bindService() 的时候,执行的方法为 onCreate()->onBind();解除绑定的时候会执行 onUnbind()->onDestory()。
  2. 我们在开发的过程中还必须注意 Service 实例只会有一个,也就是说如果当前要启动的 Service 已经存在了那么就不会再次创建该 Service 当然也不会调用 onCreate() 方法。所以,
    1. 当第一次执行 startService(intent) 的时候,会调用该 Service 中的 onCreate() 和onStartCommand() 方法。
    2. 当第二次执行 startService(intent) 的时候,只会调用该 Service 中的 onStartCommand() 方法。(因此已经创建了服务,所以不需要再次调用 onCreate() 方法了)。
  3. bindService() 方法的第三个参数是一个标志位,这里传入 BIND_AUTO_CREATE 表示在Activity 和 Service 建立关联后自动创建 Service,这会使得 MyService 中的 onCreate() 方法得到执行,但 onStartCommand() 方法不会执行。所以,在上面的程序中当调用了bindService() 方法的时候,会执行的方法有,Service 的 onCreate() 方法,以及 ServiceConnection 的 onServiceConnected() 方法。
  4. 在 3 中,如果想要停止 Service,需要调用 unbindService() 才行。
  5. 如果我们既调用了 startService(),又调用 bindService() 会怎么样呢?这时不管你是单独调用 stopService() 还是 unbindService(),Service 都不会被销毁,必须要将两个方法都调用 Service 才会被销毁。也就是说,stopService() 只会让 Service 停止,unbindService() 只会让 Service 和 Activity 解除关联,一个 Service 必须要在既没有和任何 Activity 关联又处理停止状态的时候才会被销毁。

2、Service 与线程

Service 运行在主线程里的,也就是说如果你在 Service 里编写了非常耗时的代码,程序可能会出现ANR。

Service 只意味着不需要前台 UI 的支持,即使 Activity 被销毁,或者程序被关闭,只要进程还在,Service 就可以继续运行。但是我们可以在 Service 中再创建一个子线程,然后在这里去处理耗时逻辑。

虽然也可以在 Activity 中创建线程来执行耗时任务,但是它的缺点在于该线程只能与该 Activity 关联,其他 Activity 无法对其进行控制。

所以,标准的使用是:

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 开始执行后台任务  
            }
        }).start();
        return super.onStartCommand(intent, flags, startId);
    }

    class MyBinder extends Binder {

        public void startDownload() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    // 执行具体的下载任务  
                }
            }).start();
        }
    }

当然,你也可以使用 RxJava 等封装的线程池来实现异步任务。

3、前台 Service

因为 Service 的系统优先级较低,所以当系统出现内存不足情况时,就有可能会回收掉正在后台运行的 Service。我们可以通过使用前台 Service 来解决 Service 可能被回收的问题。它的效果是在系统中显示一个驻留的通知。

前台服务的

    public class MyService extends Service {

        public static final String TAG = "MyService";

        @Override
        public void onCreate() {
            super.onCreate();
            Notification notification = new Notification(R.drawable.ic_launcher, 
                "Msg", System.currentTimeMillis());
            Intent intent = new Intent(this, MainActivity.class);
            PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
            notification.setLatestEventInfo(this, "Title", "Content", pi);
            startForeground(1, notification);
        }  
    }

4、远程 Service

远程 Service 是一种运行在其他进程中的服务。我们可以在 Manifest 中进行注册的时候通过指定进程来讲服务设置成远程的。远程的服务因为运行在另一个进程中,所以涉及跨进程调用的问题。

可以通过在 AndroidManifest.xml 中进行如下设置来将一个 Service 设置在非主线程中:

    <service  
        android:name="com.example.servicetest.MyService"  
        android:process=":remote" >  
    </service>  

也就说当前的 Service 运行在其他的进程了,不会阻碍主进行,从而也不会存在 ANR 了。但是这种方式中的 Service 是无法与 Activity 进行关联的,也就是说调用 bindService() 的时候会出现错误。如果我们想要将该 Service 与 Activity 进行关联,就需要使用 AIDL 进行跨进程通信了(IPC)。

要实现跨进程调用,我们可以按照如下步骤来实现:

首先,新建 MyAIDLService.aidl 文件:

    package com.example.servicetest;  

    interface MyAIDLService {  
        int plus(int a, int b);  
        String toUpperCase(String str);  
    }  

然后,我们要修改之前 Service 中的 bind() 方法:

    @Override  
    public IBinder onBind(Intent intent) {  
        return mBinder;  
    }

    MyAIDLService.Stub mBinder = new Stub() {  
  
        @Override  
        public String toUpperCase(String str) throws RemoteException {  
            if (str != null) {  
                return str.toUpperCase();  
            }  
            return null;  
        }  
  
        @Override  
        public int plus(int a, int b) throws RemoteException {  
            return a + b;  
        }  
    }; 

然后,我们在 ServiceConnection 中进行如下实现:

    private ServiceConnection connection = new ServiceConnection() {  
  
        @Override  
        public void onServiceDisconnected(ComponentName name) { /* Do nothing. */ }  
  
        @Override  
        public void onServiceConnected(ComponentName name, IBinder service) {  
            myAIDLService = MyAIDLService.Stub.asInterface(service);  
            try {  
                int result = myAIDLService.plus(3, 5);  
                String upperStr = myAIDLService.toUpperCase("hello world");  
            } catch (RemoteException e) {  
                e.printStackTrace();  
            }  
        }  
    };  

也就是使用 MyAIDLService.Stub.asInterface() 方法获取 MyAIDLService,并调用 MyAIDLService 的方法。这时候再调用 bindService() 就不会出现错误了。

如果我们想要在其他进程(APP)中调用该 Service,我们可以进行如下操作:

首先在 Service 添加 Intent-Filter:

    <service android:name="com.example.servicetest.MyService"  
        android:process=":remote" >  
        <intent-filter>  
            <action android:name="com.example.servicetest.MyAIDLService"/>  
        </intent-filter>  
    </service>  

这样,我们就将该 Service 设置成其他程序可访问的了。

然后,在要访问该 Service 的程序中进行如下操作:

  1. 将上述定义的 MyAIDLService 连同其包拷贝到当前程序中,即 src 目录下面。
  2. 然后在绑定 Service 的时候按照下面的方式绑定:
    Intent intent = new Intent("com.example.servicetest.MyAIDLService");
    bindService(intent, connection, BIND_AUTO_CREATE);

    private ServiceConnection connection = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {}

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myAIDLService = MyAIDLService.Stub.asInterface(service);
            try {
                int result = myAIDLService.plus(50, 50);
                String upperStr = myAIDLService.toUpperCase("comes from ClientTest");
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    };

这样我们就将该 Service 设置成了其他进程可访问的。

5、IntentService

相比于一般的 Service,IntentService 具有的特征:

  1. 会创建独立的线程来处理所有的 Intent 请求;。
  2. 会创建独立的线程来处理 onHandleIntent() 方法实现的代码,无需处理多线程问题。
  3. 所有请求处理完成后,IntentService 会自动停止,无需调用 stopSelf() 方法停止 Service;。
  4. 为 Service 的 onBind() 提供默认实现,返回 null.
  5. 为 Service 的 onStartCommand() 提供默认实现,将请求 Intent 添加到队列中。
  6. IntentService 内置的是 HandlerThread 作为异步线程,每一个交给 IntentService 的任务都将以队列的方式逐个被执行到,一旦队列中有某个任务执行时间过长,那么就会导致后续的任务都会被延迟处理。正在运行的 IntentService 的程序相比起纯粹的后台程序更不容易被系统杀死,该程序的优先级是介于前台程序与纯后台程序之间的

关于 IntentService 的源码分析,可以参考下面这篇文章:

Android 多线程编程:IntentService & HandlerThread

5、Service 保活的问题

我们可以用通过 setForeground(true) 来提升 Service 的优先级。当然这并不能保证你得Service 永远不被杀掉,只是提高了他的优先级。这种方式的缺点是会设置一个长期停留的通知,用户体验比较差。

那么如何避免后台进程被杀死?

首先,服务被杀死的情况包含下面三种:

  1. 系统根据资源分配情况杀死服务
  2. 用户通过 settings->Apps->Running->Stop 方式杀死服务
  3. 用户通过 settings->Apps->Downloaded->Force Stop 方式杀死服务

以及对应的解决办法:

  1. 调用 startForegound(),让你的 Service 所在的线程成为前台进程;
  2. Service 的 onStartCommond() 返回 START_STICKY 或 START_REDELIVER_INTENT;
  3. Service 的 onDestroy() 里面重新启动自己。

关于 onStartCommond() 的返回值的总结:

No可选值含义
1START_STICKY当 Service 因内存不足而被系统 kill 后,一段时间后内存再次空闲时,系统将会尝试重新创建此 Service,一旦创建成功后将回调 onStartCommand() 方法,但其中的 Intent 将是 null,除非有挂起的 Intent,如 pendingintent,这个状态下比较适用于不执行命令、但无限期运行并等待作业的媒体播放器或类似服务
2START_NOT_STICKY当 Service 因内存不足而被系统 kill 后,即使系统内存再次空闲时,系统也不会尝试重新创建此 Service。除非程序中再次调用 startService() 启动此 Service,这是最安全的选项,可以避免在不必要时以及应用能够轻松重启所有未完成的作业时运行服务
3START_REDELIVER_INTENT当 Service 因内存不足而被系统 kill 后,则会重建服务,并通过传递给服务的最后一个 Intent 调用 onStartCommand(),任何挂起 Intent 均依次传递。与START_STICKY 不同的是,其中的传递的 Intent 将是非空,是最后一次调用 startService() 中的 intent。这个值适用于主动执行应该立即恢复的作业(例如下载文件)的服务

在 onDestroy() 中自启的示例:

	public void onCreate() {  
	    super.onCreate();  
	    mBroadcast = new BroadcastReceiver() {  
		    @Override  
		    public void onReceive(Context context, Intent intent) {  
		        Intent a = new Intent(ServiceA.this, ServiceA.class);  
		        startService(a);  
		    }  
	    };  
	    mIF = new IntentFilter();  
	    mIF.addAction("listener");  
	    registerReceiver(mBroadcast, mIF);  
	}
	
	@Override  
	public void onDestroy() {  
	  super.onDestroy();  
	  Intent intent = new Intent();  
	  intent.setAction("listener");  
	  sendBroadcast(intent);  
	  unregisterReceiver(mBroadcast);  
	}  

上面的这种启动的实例会因为系统处于后台线程而抛出异常。

参考:

  1. Android Service完全解析,关于服务你所需知道的一切(上)
  2. Android Service完全解析,关于服务你所需知道的一切(下)
  3. 关于Android Service真正的完全详解,你需要知道的一切

Android 基础梳理系列文章,关注作者及时获取更多学习资料

什么是Service(服务)? 往期回顾: Android开发-Intent(意图) Activity(活动)的生命周期 安卓逆向交流学习:342647370 vx:yijin1108an 1.1 Service(服务)概念 服务是一个后台运行的组件,执行长时间运行且不需要用户交互的任务。即使应用被销毁也依然可以工作。 服务基本上包含两种状态,Started和Bound如下表所示: 1.2 生命周期 服务拥有生命周期方法,可以实现监控服务状态的变化,可以在合适的阶段执行工作。下面的左图展示了当服务通过startService()被创 阅读详情

相关推荐

利用正射影像对斜射图像进行反向投影

因此,RANSAC算法可以通过计算inliners和outliers的数量来评估估计关键点的质量,确保与其他点不一致的点不会在Homography矩阵中被估计。然后,它通过考虑关键点周围区域中图像的梯度大小和方向来计算每个提取的关键点的方向。由于单应性矩阵的计算可能会受到两个图像中异常值的存在的影响,这将导致矩阵的不正确估计并导致沿图像的对准和映射不良。FLANN匹配器的方法基于K近邻搜索的概念,即从图像中找到k个近邻。找到相机在正射影像坐标系中的位置并在正射影像上绘制重叠区域的边界框。

gis收藏家的博客 1511

android 创建前台服务Service

安卓前台服务提交网络数据并写入csv和text文件

jackiesky1106的博客 1562

研究生如何快速发CVPR

研究生如何快速发CVPR,找到科研方向

python_vb的博客 785

【Android】Service前台服务的使用

转载地址:Android实现点击通知栏后,先启动应用再打开目标Activity - 简书 1.什么是前台服务 前台服务是那些被认为用户知道(用户所认可的)且在系统内存不足的时候不允许系统杀死的服务。前台服务必须给状态栏提供一个通知,它被放到正在运行(Ongoing)标题之下——这就意味着通知只有在这个服务被终止或从前台主动移除通知后才能被解除。官方描述:A foreground service(前台服务) is a service that's considered to be(被用户所认可的) som

yx1166的博客 3944

从零到一:Bioconductor新手入门与R包安装实战

本文详细介绍了Bioconductor在生物信息学中的重要性及其R包安装实战指南。从环境准备到BiocManager的使用,再到常见问题排查,帮助新手快速掌握这一强大工具。特别推荐org.Hs.eg.db等核心工具包,助力基因注释和功能分析,提升研究效率。

weixin_29061041的博客 418

Apifox 自动化测试新增流程控制条件,复杂测试场景不再是问题

在 if 条件后的输入框填写请求接口得到的变量 viewed ,选择条件为「小于」,输入比较数值 10 ,并在 if 条件下添加「宠物下架处理」步骤。借助新增的自动化测试流程控制条件,测试人员就可以使用 Apifox 去实现更深层更多样的测试应用场景,帮助提升测试效率,减少复杂场景的测试操作。「查询新建宠物」、「修改宠物状态为已售出」和「查询宠物状态是否修改」步骤为当前在售宠物信息盘点的三个标准步骤,所以将这三个步骤合成一组。在循环中添加「查询在售宠物」和「修改宠物状态」步骤;

877

Android入门教程 | 四大组件之Service(前台服务,后台服务)

Service是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC)。例如,服务可在后台处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序进行交互。

Android23333的博客 6700

【低空经济】多源异构数据融合的低空智能感知系统设计与实现

本文探讨了低空智能感知系统在多源异构数据融合中的设计与实现,重点解决无人机等低空飞行器的安全监测问题。通过雷达、光学和红外传感器的数据融合,系统识别准确率提升至92%,并实现120ms的低延迟处理。文章详细介绍了时空对齐、特征级融合和动态权重自适应等关键技术,为低空经济发展提供可靠技术支持。

weixin_29065659的博客 342

Service-前台服务

前台服务简介效果具体代码 简介 后台服务在系统内存不足时有被回收的可能,为了保活服务我们可以选择将服务写为前台服务。前台服务优先级更高、不易被回收,除非停止服务。 效果 具体代码 MyService.java public class MyServices extends Service { private static final String TAG = "amy"; @Override public void onCreate() { super.

amynn的博客 1244

【QT】基于QSerialPort的跨平台串口通信实战指南

本文是一份基于Qt QSerialPort模块的跨平台串口通信实战指南。详细介绍了从硬件基础、QSerialPort核心类使用、参数配置、设备自动发现到数据异步读写和错误处理的完整流程,并通过构建一个功能齐全的串口调试助手实例,帮助开发者快速掌握在Windows、Linux和macOS系统下进行高效、稳定的串口应用开发。

a1b2c3d的博客 981

ERROR: Ignored the following yanked versions: 0.8.3, 0.10.19.dev18 的解决办法

关于这个问题,博主是在进行项目中的python依赖包安装的时候遇见的,遇到的异常:关于这个问题,是在。

Spring Boot-Common On With You 642

Service解析(二) 前台Service

一.什么是前台Service 希望能够让Service显示在通知栏里,不被进程杀掉 二.设置前台Service @Override public IBinder onBind(Intent intent) { //设置为前台服务 Notification.Builder builder = new Notification.Builder(this...

yuemingxingxing的博客 311

Python爬虫实战:利用Playwright与异步技术高效抓取链家十万级二手房数据

在开始编写代码之前,我们首先需要为项目选择合适的技术栈。1. 传统方案:Requests + BeautifulSoup优点: 简单、轻量、学习成本低。直接发送HTTP请求获取HTML,然后解析。缺点: 对于大量由JavaScript动态渲染的内容无能为力。现代网站(包括链家)大量使用JS来加载数据和实现交互,简单的HTTP请求无法获取到完整的页面内容。此外,容易被基于IP或请求头特征的反爬机制拦截。2. 进阶方案:Selenium优点。

2201_76125261的博客 890

android-基础回顾篇# service_1、Service简单介绍、生命周期1:startService启动服务

一、Service简单介绍 Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。服务的开发比较简单,如下: 第一步:继承Service类 public class XXXService extends Service { } 第二步:在AndroidManifest.xml文件中的<ap...

鲁迷那的专栏—坚持实践后再写出来! 390

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android 回顾Service之Service基础使用

这两天在回顾Android Service方面的知识,趁着记忆没有消退之前,来总结一下。本文主要讲解Service的基本概念与使用、跨进程调用Service、系统常见Service的使用。所以本文的难度微乎其微,仅适用于想回顾Service知识点的同学,或者还不怎么了解Service的同学,至于Service源码之类的东东,等老夫分析研究之后再来分享。 一、Service基础       我相

GeneralAndroid的专栏 1974

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android动态service,Android基础回顾之Service

Service四大组件之一,是Android的一种机制,服务是运行在主线程上的,没有界面1.service和Thread的区别和场景Thread:程序执行的最小单元,它是分配CPU的基本单位。生命周期:新建-就绪-运行-死亡-阻塞缺点:无法控制,当activity关闭之后不再持有thread,activity将无法控制threadService:是Android的一种机制,由系统进程托管,服务是运...

weixin_42174176的博客 341

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

uniapp使用uts插件启动原生安卓Service

uniapp使用uts插件启动前台服务

abs625的博客 3657

【Android Service】Service基础

Service作为安卓的四大组件之一作用非凡,主要来执行一些后台任务。一些需要长期运行的任务、甚至是app退出后还需要执行的任务都离不开Service。本章节就复习回顾下这个重要的组件。 知识点 一、简介 1、概念 服务是一种应用程序组件,表示应用程序希望在不与用户交互的情况下执行较长时间运行的操作,或者为其他应用程序提供使用的功能。和Activity不同,Service是一个可以长期运行...

dev晴天的博客 608

Android之service一些基础回顾

今天是开始记录学习的第二天,今天记录的东西大部分是以前学过的,今天在这里把它梳理成文,主要还是对以前学习的一个总结和回顾。知识除了积累还要经常温故,古语有云:温故而知新。 1.Service的启动一般都是 某个组件调用startService 或者 bindService   2. 通过 Android特有的 Binder IPC机制 通知 ActivityServiceManager ,

liuhaomatou的专栏 4090

Android探索之Service全面回顾及总结

什么是Service? Service(服务)是Android提供的四大组件之一,是一个没有用户界面的在后台运行执行耗时操作的应用组件。其他应用组件能够启动Service,并且当用户切换到另外的应用场景,Service将持续在后台运行。为了方便记忆,我们可以把Service看做是没有页面的Activity,它总是默默的后台处理一些耗时的操作或者不干扰用户使用的后台操作,例如,...

134

【Android】基础回顾--四大组件

继承至BroadcastReceiver基类重写onReceiver()方法广播接收器收到相应广播后,会自动回调onReceiver()方法;一般情况下,onReceiver方法会涉及与其他组件之间的交互,如发送Notification、启动service等等;默认情况下,广播接收器运行在UI线程,因此onReceiver方法不能执行耗时操作,否则可能ANR。

2303_79296612的博客 3953

android五中方式调用服务service中的方法

今天看到一张图片,上面有句话 —- 没有伞的孩子,要快跑 android五中方式调用服务service中的方法分别是 - 通过重复调用startService 来根据意图Intent传递的参数调用 - 通过Handle调用 - 通过bindService调用 - 通过AIDL调用 - 通过BroadcastReceiver调用再讲解这五中方法之前我们先来回顾一下Serv

z8z87878的博客 1万+

Android Service详解

  各位肯定知道 Service 作为 Android 的四大组件之一是非常重要的。不过说实话,我实际开发项目中服务用的并不多,(可能和需求有关吧)但是笔试的时候,几乎是必出的题目了,所以我们今天就来仔细的回顾一下 Service 。 1. 什么是服务? Service 是表示应用程序需求的应用程序组件,在不与用户交互的情况下执行长时间运行的操作,或者给其他应用程序提供使用的功能。Servi...

李家大大大公子 4344

Android Service使用方法回顾

    Service作为Android四大组件之一,承载着重要的作用,同时,熟悉Service也会为理解Binder打下重要的基础,这里是我初学Android时做的关于Service的笔记,现在总结到这篇文章中。概述android中的service与Windows中的服务类似,一般没有用户界面,运行在后台,可以执行耗时的操作,是安卓四大组件之一。其他组件可以启动service,并且当用户切换另外...

u012545728的博客 418

Android知识点回顾之Service基础

一、Service的简介 Service为Android四大组件之一,和Activity一样,都是Context的子类,只是它没有界面,Service很适合去执行那些长时间运行又不需要和用户交互的任务。由于Service本身是在主线程运行的,所以如果需要执行耗时操作还是需要另外开启子线程,否则会出现ANR错误。 Service包含三种类型: Foreground:前台服务。启动的时候使用通知...

weixin_34186931的博客 109

android 基础回顾(一)

1.1 Android Activity Q:说下Activity的生命周期? 技术点:Activity生命周期 思路:分条解释Activity从创建到销毁整个生命周期中涉及到的方法及作用 参考回答:在Activity的生命周期涉及到七大方法,分别是: onCreate()表示Activity 正在创建,常做初始化工作,如setContentView界面资源、初始化数据 on...

qq_35874340的博客 482
上一篇: Android 基础回顾:Fragment 基础
下一篇: Android 基础回顾:Broadcast 基础
开发者如是说
博客等级 码龄10年 67粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值