iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android Service中方法使用详细介绍
  • 870
分享到

Android Service中方法使用详细介绍

androidserviceservice方法Android 2022-06-06 07:06:06 870人浏览 泡泡鱼
摘要

 service作为四大组件值得我们的更多的关注 在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务。例如,一个从s

 service作为四大组件值得我们的更多的关注

Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务。例如,一个从service播放音乐的音乐播放器,应被设置为前台运行,因为用户会明确地注意它的运行.在状态栏中的通知可能会显示当前的歌曲并且允许用户启动一个activity来与音乐播放器交互。

Service的两种实现形式

1.非绑定

通过调用应用程序组件(例如Activity)的startService()方法来启动一个服务.一旦启动,服务就会在后台一直运行,即使应用程序组件此时被关闭.通常,已经启动的服务会处理一些单一功能,并且也不需要返回结果给调用者.例如,在网络上下载或上传文件.当服务的工作处理结束,才会自己关闭服务.

2.绑定(bind)

通过调用应用程序组件的bindService()方法来绑定一个服务.已绑定的服务会提供一个客户端-服务端交互接口.该接口主要用来与应用程序交互,发送请求,获取结果,甚至通过IPC来访问进程.只要一个程序组件绑定服务就会运行绑定服务,多个应用程序组件可以同时时间绑定一个服务.当所有的应用程序组件都解除绑定,该绑定服务器就会被销毁.

实现service的方法介绍

onStartCommand()

  系统在其它组件比如activity通过调用startService()请求service启动时调用这个方法.一旦这个方法执行,service就启动并且在后台长期运行.如果你实现了它,你需要负责在service完成任务时停止它,通过调用stopSelf()或stopService().(如果你只想提供绑定,你不需实现此方法).

OnBind()

  当组件调用bindService()想要绑定到service时(比如想要执行进程间通讯)系统调用此方法.在你的实现中,你必须提供一个返回一个IBinder来以使客户端能够使用它与service通讯,你必须总是实现这个方法,但是如果你不允许绑定,那么你应返回null.

OnCreate()

  系统在service第一次创建时执行此方法,来执行只运行一次的初始化工作(在调用它方法如onStartCommand()或onBind()之前).如果service已经运行,这个方法不会被调用.

OnDestroy()

  系统在service不再被使用并要销毁时调用此方法.你的service应在此方法中释放资源,比如线程,已注册的侦听器,接收器等等.这是service收到的最后一个调用.

  如果一个组件通过调用startService()启动一个service(最终导致onStartCommand()被调用),之后service会保持运行,直到它通过stopSelf()停止自己或另外的组件调用stopService()停止它.

service实现代码

1.非绑定

新建一个MyService继承自Service,并重写父类的onCreate()、onStartCommand()和onDestroy()方法


public class MyIntentService extends IntentService { 
public MyIntentService() { 
super("MyIntentService"); 
} 
@Override 
protected void onHandleIntent(Intent intent) { 
// IntentService会使用单独的线程来执行该方法的代码 
// 该方法内执行耗时任务,比如下载文件,此处只是让线程等待20秒 
long endTime = System.currentTimeMillis() + 20 * 1000; 
System.out.println("onStart"); 
while (System.currentTimeMillis() < endTime) { 
synchronized (this) { 
try { 
wait(endTime - System.currentTimeMillis()); 
} catch (InterruptedException e) { 
e.printStackTrace(); 
} 
} 
} 
System.out.println("----耗时任务执行完成---"); 
} 
}

我们在布局文件中加入了两个按钮,一个用于启动Service,一个用于停止Service。
然后打开或新建MainActivity作为程序的主Activity,在里面加入启动Service和停止Service的逻辑,代码如下所示:


public class MainActivity extends Activity implements OnClickListener { 
private Button startService; 
private Button stopService; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
startService = (Button) findViewById(R.id.start_service); 
stopService = (Button) findViewById(R.id.stop_service); 
startService.setOnClickListener(this); 
stopService.setOnClickListener(this); 
} 
@Override 
public void onClick(View v) { 
switch (v.getId()) { 
case R.id.start_service: 
Intent startIntent = new Intent(this, MyService.class); 
startService(startIntent); 
break; 
case R.id.stop_service: 
Intent stopIntent = new Intent(this, MyService.class); 
stopService(stopIntent); 
break; 
default: 
break; 
} 
}

项目中的每一个Service都必须在AndroidManifest.xml中注册才行,所以还需要编辑AndroidManifest.xml文件,代码如下所示:


<application 
android:allowBackup="true" 
android:icon="@drawable/ic_launcher" 
android:label="@string/app_name" 
android:theme="@style/AppTheme" > 
…… 
<service android:name="com.example.servicetest.MyService" > 
</service> 
</application>

周期分析

onCreate()方法只会在Service第一次被创建的时候调用,如果当前Service已经被创建过了,不管怎样调用startService()方法,onCreate()方法都不会再执行。因此你可以再多点击几次Start Service按钮试一次,每次都只会有onStartCommand()方法中的打印日志

2.绑定的service


public class LocalService extends Service { 
// Binder given to clients 
private final IBinder mBinder = new LocalBinder(); 
// Random number generator 
private final Random mGenerator = new Random(); 
public class LocalBinder extends Binder { 
LocalService getService() { 
// 返回本service的实例到客户端,于是客户端可以调用本service的公开方法 
return LocalService.this; 
} 
} 
@Override 
public IBinder onBind(Intent intent) { 
return mBinder; 
} 
 
public int getRandomNumber() { 
return mGenerator.nextInt(100); 
} 
}

下面是一个绑定到LocalService并且在按钮按下时调用getRandomNumber()的actvity的例子:


public class BindingActivity extends Activity { 
LocalService mService; 
boolean mBound = false; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
} 
@Override 
protected void onStart() { 
super.onStart(); 
// 绑定到类LocalService的实例 
Intent intent = new Intent(this, LocalService.class); 
bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 
} 
@Override 
protected void onStop() { 
super.onStop(); 
// 从service解除绑定 
if (mBound) { 
unbindService(mConnection); 
mBound = false; 
} 
} 
 
public void onButtonClick(View v) { 
if (mBound) { 
// 调用LocalService的一个方法 
// 然而,如果这个调用中有挂起操作,那么这个请求应发 
// 生在另一个线程来避免拉低activity的性能. 
int num = mService.getRandomNumber(); 
Toast.makeText(this, "number: " + num, Toast.LENGTH_SHORT).show(); 
} 
} 
 
private ServiceConnection mConnection = new ServiceConnection() { 
@Override 
public void onServiceConnected(ComponentName className, 
IBinder service) { 
//我们已经绑定到了LocalService,把IBinder进行强制类型转换并且获取LocalService实例. 
LocalBinder binder = (LocalBinder) service; 
mService = binder.getService(); 
mBound = true; 
} 
@Override 
public void onServiceDisconnected(ComponentName arg0) { 
mBound = false; 
} 
}; 
}

service的周期函数

1、当采用Context.startService()方法启动服务,与之有关的生命周期方法

onCreate()–> onStart()–> onDestroy()
onCreate()该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。

onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart() 方法会被多次调用。
onDestroy()该方法在服务被终止时调用。

2、 当采用Context.bindService()方法启动服务,与之有关的生命周期方法

onCreate()–> onBind() –> onUnbind() –> onDestroy()
onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。

onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。

如果先采用startService()方法启动服务,然后调用bindService()方法绑定到服务,再调用unbindService()方法解除绑定,最后调用bindService()方法再次绑定到服务,触发的生命周期方法如下:

onCreate()–>onStart()–>onBind()–>onUnbind()[重载后的方法需返回true–>onRebind()

那么如果我们既点击了Start Service按钮,又点击了Bind Service按钮会怎么样呢?

这个时候你会发现,不管你是单独点击Stop Service按钮还是Unbind Service按钮,Service都不会被销毁,必要将两个按钮都点击一下,Service才会被销毁。也就是说,点击Stop Service按钮只会让Service停止,点击Unbind Service按钮只会让Service和Activity解除关联,一个Service必须要在既没有和任何Activity关联又处理停止状态的时候才会被销毁。

Service和Thread的区别

主要就是因为Service的后台概念。Thread我们大家都知道,是用于开启一个子线程,在这里去执行一些耗时操作就不会阻塞主线程的运行。而Service我们最初理解的时候,总会觉得它是用来处理一些后台任务的,一些比较耗时的操作也可以放在这里运行,这就会让人产生混淆了。但是,如果我告诉你Service其实是运行在主线程里的,所以是没有任何关系的。

Service又有何用呢?

其实大家不要把后台和子线程联系在一起就行了,这是两个完全不同的概念。

Android的后台就是指,它的运行是完全不依赖UI的。即使Activity被销毁,或者程序被关闭,只要进程还在,Service就可以继续运行。

比如说一些应用程序,始终需要与服务器之间始终保持着心跳连接,就可以使用Service来实现。你可能又会问,前面不是刚刚验证过Service是运行在主线程里的么?在这里一直执行着心跳连接,难道就不会阻塞主线程的运行吗?当然会,但是我们可以在Service中再创建一个子线程,然后在这里去处理耗时逻辑就没问题了。

使用service创建线程和activity直接创建线程的区别

Activity很难对Thread进行控制,当Activity被销毁之后,就没有任何其它的办法可以再重新获取到之前创建的子线程的实例。而且在一个Activity中创建的子线程,另一个Activity无法对其进行操作。但是Service就不同了,所有的Activity都可以与Service进行关联,然后可以很方便地操作其中的方法,即使Activity被销毁了,之后只要重新与Service建立关联,就又能够获取到原有的Service中Binder的实例。因此,使用Service来处理后台任务,Activity就可以放心地finish,完全不需要担心无法对后台任务进行控制的情况。

IntentService介绍

IntentService是Service的子类,比普通的Service增加了额外的功能。

先看Service本身存在两个问题:

Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中;

Service也不是专门一条新线程,因此不应该在Service中直接处理耗时的任务;

二、IntentService特征

会创建独立的worker线程来处理所有的Intent请求;

会创建独立的worker线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题;

所有请求处理完成后,IntentService会自动停止,无需调用stopSelf()方法停止Service;

为Service的onBind()提供默认实现,返回null;

为Service的onStartCommand提供默认实现,将请求Intent添加到队列中;

实现


public class MyIntentService extends IntentService { 
public MyIntentService() { 
super("MyIntentService"); 
} 
@Override 
protected void onHandleIntent(Intent intent) { 
// IntentService会使用单独的线程来执行该方法的代码 
// 该方法内执行耗时任务,比如下载文件,此处只是让线程等待20秒 
long endTime = System.currentTimeMillis() + 20 * 1000; 
System.out.println("onStart"); 
while (System.currentTimeMillis() < endTime) { 
synchronized (this) { 
try { 
wait(endTime - System.currentTimeMillis()); 
} catch (InterruptedException e) { 
e.printStackTrace(); 
} 
} 
} 
System.out.println("----耗时任务执行完成---"); 
} 
}

activity代码


public void startIntentService(View source) { 
// 创建需要启动的IntentService的Intent 
Intent intent = new Intent(this, MyIntentService.class); 
startService(intent); 
}

以上所述是小编给大家介绍的Android Service中方法使用详细介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程网网站的支持!

您可能感兴趣的文章:Android Service服务详细介绍及使用总结Android Service绑定过程完整分析Android Service总结及详细介绍Android开发入门之Service用法分析Android中Service的全面总结浅谈Android中Service的注册方式及使用


--结束END--

本文标题: Android Service中方法使用详细介绍

本文链接: https://www.lsjlt.com/news/23974.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • fastjson 使用方法详细介绍
    Fastjson介绍Fastjson是一个Java语言编写的JSON处理器。遵循http://json.org标准,为其官方网站收录的参考实现之一。功能qiang打,支持JDK的各种类型,包括基本的JavaBean、Collection、M...
    99+
    2023-05-30
    fastjson 使用
  • 详细介绍golang中.()的使用方法
    Golang是一门非常流行的编程语言,在很多领域都有着广泛的应用。在开发过程中,很多时候我们需要将函数作为参数传递给其他函数,这时候就需要用到golang中的.()用法。本文将详细介绍golang中.()的使用方法。什么是.()用法?在go...
    99+
    2023-05-14
  • React Immutable使用方法详细介绍
    目录1. 介绍2. 优缺点3. 对象处理4. 数组处理5. 优化组件渲染6. immutable和redux集合使用1. 介绍 假设当前 redux 的大小为 1G,现在要修改 re...
    99+
    2024-04-02
  • 详细介绍Github的使用方法
    随着互联网技术的不断发展,越来越多的开发者开始加入到开源项目中,Github作为目前全球最大的代码托管平台之一,也成为了开发者们分享、学习、合作的重要工具之一。然而,如何使用Github来进行代码管理、版本控制、协作开发等,还是很多新手开发...
    99+
    2023-10-22
  • Vuex详细介绍和使用方法
    目录一、什么是Vuex二、运行机制三、创建项目1、使用脚手架搭建Vue项目2、安装Vuex3、启动项目4、配置使用Vuex4.1、创建store文件夹4.2、配置全局使用store对...
    99+
    2024-04-02
  • Android  Service类与生命周期详细介绍
    Android  Service类与生命周期Service是Android四大组件与Activity最相似的组件,都代表可执行的程序,区别在于Service一直在后台运行且没有用户界面。Service的类图和生命周期先来看看Ser...
    99+
    2023-05-31
    android service bs
  • Maven使用方法详及方式详细介绍
    目录Maven简介1、软件开发中的阶段2、Maven能做什么3、没有使用maven怎么管理依赖4、什么是maven约定目录结构maven的使用方式POM文件坐标的概念依赖 depen...
    99+
    2022-11-13
    Maven使用方法 Maven方法 Maven使用方式
  • React中setState/useState的使用方法详细介绍
    目录一、React如何使用setState/useState的最新的值A.使用setState的最新的值B.使用useState的最新的值二、React中setState/useSt...
    99+
    2023-05-14
    React setState与useState React setState React useState
  • Android内置SQLite的使用详细介绍
    目录一、创建数据库  1、新建数据库帮助类2、在数据库帮助类中输入代码3、代码讲解  二、添加数据1、界面效果2、准备工作3、布局界面 activity_main...
    99+
    2024-04-02
  • JavaInheritableThreadLocal用法详细介绍
    目录简介问题复现解决方案源码分析注意简介 本文介绍InheritableThreadLocal的用法。 ThreadLocal可以将数据绑定当前线程,如果希望当前线程的ThreadL...
    99+
    2024-04-02
  • Python3 pickle模块的使用方法详细介绍
    pickle模块特点 1、只能在python中使用,只支持python的基本数据类型。 2、可以处理复杂的序列化语法。(例如自定义的类的方法,游戏的存档等) 3、序列化的时候,只是...
    99+
    2024-04-02
  • Golang内置函数使用方法详细介绍
    Golang是一种非常强大的编程语言,其提供许多内置函数以方便开发者进行编程。在本文中,我们将详细介绍Golang内置函数的使用方法,以供开发者参考。make函数make函数主要用于创建一个数据类型的对象(slice、map或channel...
    99+
    2023-05-16
    Golang(Go语言) 内置函数(built-in functions) 使用方法(usage methods)
  • Android Jetpack组件中LifeCycle作用详细介绍
    目录Jetpack1、那么Jetpack是什么呢2、为何使用Jetpack3、Jetpack与AndroidXLifeCycle1、LifeCycle的作用2、LifeCycle应用...
    99+
    2024-04-02
  • Mysql优化方法详细介绍
    目录1、字段属性2、字段NOT NULL3、JOIN代替子查询4、UNION代替手动创建临时表5、事务6、索引下面聊聊mysql常见的优化方法。 1、字段属性 mysql是一...
    99+
    2023-02-03
    Mysql优化 Mysql优化方法
  • Java中ArrayList的使用详细介绍
    目录1.ArrayList类1.1ArrayList类概述1.2ArrayList类常用方法1.2.1构造方法1.2.2成员方法1.2.3示例代码1.3ArrayList存储字符串并...
    99+
    2024-04-02
  • 详细介绍PHP中SQL查询语句的使用方法
    PHP是一种流行的服务器端编程语言,MySQL是一种广泛应用的关系型数据库管理系统,它们的结合能够为Web应用程序提供强大的查询和数据处理能力。在PHP开发过程中,SQL查询语句是必须掌握的知识之一。本文将详细介绍PHP中SQL查询语句的使...
    99+
    2023-05-14
    SQL php
  • SpringCloud Gateway DispatcherHandler调用方法详细介绍
    目录前言DispatcherHandler类声明handle方法最后总结一下前言 之前几节我们分析了请求是如何调用到HttpWebHandlerAdapter的,然后再调用到Disp...
    99+
    2022-11-13
    SpringCloud Gateway DispatcherHandler SpringCloud DispatcherHandler
  • vue中keepAlive组件的作用和使用方法详细介绍
    这篇文章主要讲解了“vue中keepAlive组件的作用和使用方法详细介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue中keepAlive组件的作用和使用方法详细介绍”吧!前言在面试...
    99+
    2023-06-20
  • C++BoostMultiIndex使用详细介绍
    目录一、关于BOOST的容器二、Boost.MultiIndex练习一、关于BOOST的容器 容器是 C++ 中最有用的数据结构之一。标准库提供了许多容器,而 Boost 库提供的更...
    99+
    2022-11-13
    C++ Boost MultiIndex C++ MultiIndex
  • HTML5的download属性详细介绍和使用方法
    这篇文章主要介绍“HTML5的download属性详细介绍和使用方法”,在日常操作中,相信很多人在HTML5的download属性详细介绍和使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作