热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:四大组件—Serivce

篇首语:本文由编程笔记#小编为大家整理,主要介绍了四大组件—Serivce相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了四大组件—Serivce相关的知识,希望对你有一定的参考价值。






Service

什么是Service

Service是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。Service不依赖于任何用户界面,即使App被切到后台,Service仍可以正常运行。当某个程序进程被杀掉时,所有依赖于该进程的Service也会停止。


Service与Thread的区别

线程是程序执行的最小单位,用来处理异步操作。

Service是android提供的一种机制,Service运行于主线程中,是Context的子类,可以调用Context的所有方法,通过startService,stopService,bindService,unbindService来控制。由于Service默认运行在主线程中,所以不可以处理耗时任务,否则可能导致ANR。除非将Service放到子线程中执行,或者使用IntentService。


Service的生命周期

图片


  • 通过startService启动一个Serive,并且回调onStartCommand方法,如果服务尚未创建,则先回调onCreate方法,在调用onStartCommand方法。一个服务onCreate方法只会调用一次,而onStartCommand方法会调用多次(取决于startService次数)。启动之后,服务会一直处于运行状态,即使启动服务的组件销毁,Service也不会停止,除非进程结束,或者调用stopService,又或者自身调用stopSelf。服务停止并回调onDestroy方法。
  • 通过bindService绑定一个服务,并且回调服务中的onBind方法。如果服务尚未创建,则先回调onCreate方法,在调用onbind方法。onbind方法中,返回一个IBinder对象实例,便于实现服务与组件之间的通信。

这两种启动方式并不冲突,当使用了startService启动Serivce之后,还可以再使用bindService绑定,只不过需要同时调用stopService和unbindService方法才能销毁服务。


普通Serive

启动方式:

// 在AndroidManifest.xml中注册
<service
android:name&#61;".MyService"
android:enabled&#61;"true"
android:exported&#61;"true">

service>

// 启动
Intent intent &#61; new Intent(MainActivity.this,MyService.class);
startService(intent);
// 关闭
Intent intent &#61; new Intent(MainActivity.this,MyService.class);
stopService(intent);

public class MyService extends Service {
public MyService() {
}
&#64;Override
public void onCreate() {
super.onCreate();
}
&#64;Override
public int onStartCommand(Intent intent, int flags, int startId) {

// doSomething

stopSelf();
return super.onStartCommand(intent, flags, startId);
}

&#64;Nullable
&#64;Override
public IBinder onBind(Intent intent) {
return null;
}
}

如果想要与其他组件交互如Activity&#xff1a;

public class MyService extends Service {
public MyService() {
}
MyBinder binder &#61; new MyBinder();

&#64;Override
public IBinder onBind(Intent intent) {
return binder;
}
static class MyBinder extends Binder{
public void doSomething(){}
}
}

private MyService.MyBinder binder;
private ServiceConnection connection &#61; new ServiceConnection() {
&#64;Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder &#61; (MyService.MyBinder) service;
}
&#64;Override
public void onServiceDisconnected(ComponentName name) {
}
};
// 绑定服务
bindService(intent,connection, Context.BIND_AUTO_CREATE);
// 交互
binder.doSomething();
// 解绑
unbindService(connection);

前台Service

前台Service一直会有一个正在运行的图标在系统的状态栏中&#xff0c;非常类似通知的效果。前台服务为了防止服务被回收掉。

要实现前台Service非常简单&#xff0c;先构建一个Notification之后&#xff0c;不需要NotificationManager将通知显示出来&#xff0c;而是调用startForeground方法。


IntentService

IntentService可以自动创建一个异步的、会自动停止的服务。

新建类并继承IntentService

public class MyIntentService extends IntentService {
/**
* Creates an IntentService. Invoked by your subclass&#39;s constructor.
*
* &#64;param name Used to name the worker thread, important only for debugging.
*/

public MyIntentService(String name) {
super(name);
}
&#64;Override
protected void onHandleIntent(&#64;Nullable Intent intent) {
}
}

在Activity中启动就与普通Service无异。






推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文介绍了如何使用vue-awesome-swiper组件,包括在main.js中引入和使用swiper和swiperSlide组件,以及设置options和ref属性。同时还介绍了如何在模板中使用swiper和swiperSlide组件,并展示了如何通过循环渲染swipes数组中的数据,并使用picUrl属性显示图片。最后还介绍了如何添加分页器。 ... [详细]
  • 本文介绍了如何使用elementui分页组件进行分页功能的改写,只需一行代码即可调用。通过封装分页组件,避免在每个页面都写跳转请求的重复代码。详细的代码示例和使用方法在正文中给出。 ... [详细]
author-avatar
红白蓝2502891727
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有