onStartCommand(android service用法)
android lifecycle 用法 -回复
android lifecycle 用法-回复Android生命周期的用法一. 简介Android生命周期是指一个Android应用程序在运行过程中各个组件的状态变化顺序。
了解和掌握Android生命周期是开发Android应用程序的基本功之一。
在本文中,我们将一步一步回答关于Android生命周期的用法。
二. 活动(Activity)的生命周期1. onCreate() - 这个方法是在活动被创建时调用的。
在这个方法中,我们可以完成一些初始化工作,比如设置布局、绑定控件,以及一些其他必要的准备工作。
2. onStart() - 这个方法是在活动即将变为可见状态时调用的。
在这个方法中,我们可以做一些准备工作,比如加载数据、注册监听器。
3. onResume() - 这个方法是在活动进入前台并可见时调用的。
这是活动与用户进行交互的时刻,我们可以在此方法中处理用户输入、更新UI等操作。
4. onPause() - 这个方法是在活动失去前台焦点但仍可见时调用的。
在这个方法中,我们应该暂停正在进行的操作,比如暂停动画、停止网络请求等。
5. onStop() - 这个方法是在活动即将进入后台不可见状态时调用的。
在这个方法中,我们可以释放资源、保存数据等操作,以便在恢复时能够正常运行。
6. onRestart() - 这个方法是在活动从停止状态重新启动时调用的。
我们可以在这个方法中做一些重新初始化的工作。
7. onDestroy() - 这个方法是在活动被销毁时调用的。
在这个方法中,我们应该释放所有的资源,比如关闭数据库连接、注销广播接收器等。
三. 片段(Fragment)的生命周期1. onAttach() - 这个方法是在片段与活动关联时调用的。
在这个方法中,我们可以获取到与该片段关联的活动的引用,以便进行交互操作。
2. onCreate() - 这个方法是在片段被创建时调用的。
在这个方法中,我们可以进行一些初始化工作,比如设置布局、绑定控件等。
AndroidService两种启动方式详解(总结版)
AndroidService两种启动方式详解(总结版)Service生命周期.png第一种方式:通过StartService启动Service通过startService启动后,service会一直无限期运行下去,只有外部调用了stopService()或stopSelf()方法时,该Service才会停止运行并销毁。
要创建一个这样的Service,你需要让该类继承Service类,然后重写以下方法:•onCreate()•1.如果service没被创建过,调用startService()后会执行onCreate()回调;onStartCommand回调。
第二种方式:通过bindService启动ServicebindService启动服务特点:1.bindService启动的服务和调用者之间是典型的client-server 模式。
调用者是client,service则是server端。
service只有一个,但绑定到service上面的client可以有一个或很多个。
这里所提到的client指的是组件,比如某个Activity。
2.client可以通过IBinder接口获取Service实例,从而实现在client端直接调用Service中的方法以实现灵活交互,这在通过startService方法启动中是无法实现的。
3.bindService启动服务的生命周期与其绑定的client息息相关。
当client销毁时,client会自动与Service解除绑定。
当然,client 也可以明确调用Context的unbindService()方法与Service解除绑定。
当没有任何client与Service绑定时,Service会自行销毁。
bindService代码实例交互界面设计如下:ActivityA界面布局.pngActivityB界面布局.pngActivityA还在绑定连接中,所以不会执行Service的解绑方法。
AndroidService启动方式,生命周期和应用场景详解
AndroidService启动⽅式,⽣命周期和应⽤场景详解Android Service 启动⽅式,⽣命周期和应⽤场景详解备注: Android Service 启动⽅式,⽣命周期和应⽤场景详解: ContentProvider1进程⼀代码: ContentProvider1进程⼆代码: iOS APP打包上传审核和客服咨询流程(审核被拒,账号问题等):startService 和 bindService 区别: startService 特点:⼀旦服务开启跟调⽤者(开启者)就没有任何关系了。
开启者退出了,开启者挂了,服务还在后台长期的运⾏。
开启者不能调⽤服务⾥⾯的⽅法。
bindService 特点:bind的⽅式开启服务,绑定服务,调⽤者挂了,服务也会跟着挂掉。
绑定者可以调⽤服务⾥⾯的⽅法。
(说⽩了就和⼩程序⼀样,打开的时候使⽤,⽤完了就关闭拍屁股⾛⼈,⼀次性滴)注意:绑定服务不会调⽤onstart()或者onstartcommand()⽅法⼀,Service 含义:Service分为本地服务(LocalService)和远程服务(RemoteService): 1、本地服务依附在主进程上⽽不是独⽴的进程,这样在⼀定程度上节约了资源,另外Local服务因为是在同⼀进程因此不需要IPC,也不需要AIDL。
相应bindService会⽅便很多。
主进程被Kill后,服务便会终⽌。
2、远程服务为独⽴的进程,对应进程名格式为所在包名加上你指定的android:process字符串。
由于是独⽴的进程,因此在Activity所在进程被Kill的时候,该服务依然在运⾏,不受其他进程影响,有利于为多个进程提供服务具有较⾼的灵活性。
该服务是独⽴的进程,会占⽤⼀定资源,并且使⽤AIDL进⾏IPC稍微⿇烦⼀点。
Service启动⽅式(主要是1,2两种): 1、startService 启动的服务:主要⽤于启动⼀个服务执⾏后台任务,不进⾏通信。
android service原理
android service原理Android Service是Android操作系统中的一个核心概念之一,它是在后台中运行的一个应用程序组件,可以执行长时间运行的任务且不依赖于界面界面。
这篇文章将详细地解释Android Service的原理和功能。
1. 什么是Android ServiceAndroid Service是一种可以在后台执行操作的组件,它可以执行长时间运行的任务而不会干扰用户的操作。
Service不需要用户界面,可以在后台运行。
Service 可以执行诸如播放音乐、下载文件等耗时操作,而这些操作都是在后台执行的。
2. Android Service的工作原理在Android系统中,Service是一个独立的线程,它可以在后台运行,并执行特定的任务。
通过向Service发送命令,应用程序可以与Service进行交互。
在Android 系统中,Service通常会绑定到应用程序的活动中。
当应用程序需要Service执行某些操作时,它可以通过以下两种方式之一向Service发送命令:① 使用Intent:应用程序可以使用Intent来启动和停止Service。
当Service收到Intent的请求时,它将根据请求执行相应的操作。
② 使用绑定应用程序可以使用绑定机制来连接Service。
这种连接是基于“客户端-服务器”模式,并且它构成了Service 的一部分。
当应用程序与Service绑定时,它可以使用Service提供的API进行交互。
Service可以在后台运行,因此它可以一直保持运行状态,即使应用程序已经关闭。
Service的这种特性使得它非常适合执行一些与用户界面无关的任务,例如:下载文件、播放音乐等。
3. Android Service的类型Android系统中有两种Service类型:前台(Service.FOREGROUND)和后台(Service.BACKGROUND)。
startservice 重复调用
startservice 重复调用在Android中,服务是一种可以在后台独立运行的组件,可以通过startService()方法启动服务。
但是,在某些情况下,我们可能会意外地重复调用startService()方法,导致服务运行不正常。
本文将为读者详细介绍startService重复调用的情况以及相应的解决方案。
1. 什么是startService重复调用?当我们使用startService()方法启动一个服务时,如果在服务正在运行的情况下再次调用该方法,服务将重复启动,也就是说,onStartCommand()方法将被再次调用。
在这种情况下,我们可能会得到与我们所期望的不同的结果,这会影响我们应用程序的正常运行。
2. 为什么会发生startService重复调用?发生startService重复调用可能是由以下情况引起的:- 在代码中多次调用了startService()方法。
- 启动服务的组件被重新创建。
例如,当旋转屏幕时,Activity 将被销毁并重新创建,这可能导致重新启动服务。
3. startService重复调用的解决方案在遇到startService重复调用的情况下,我们需要采取一些措施来避免这种情况。
以下是一些解决方案:- 使用Intent的equals()方法进行比较:我们可以使用Intent 的equals()方法来比较两个Intent对象是否相等,并在服务正在运行的情况下避免重复启动服务。
例如,我们在onStartCommand()方法中使用以下代码:if(intent.equals(lastIntent)){return super.onStartCommand(intent,flags,startId);}lastIntent = intent;- 使用单例模式:我们可以将启动服务的方法转换为单例模式,并限制仅调用一次,这样就可以避免在服务运行时多次启动服务。
- 使用IntentService:IntentService是Service的一种特殊类型,它会自动执行工作线程上的任务并在完成后自动停止服务。
android service用法
android service用法Android Service是Android中的一个非常重要的概念,它是一种可以在后台运行的组件。
Service可以用来执行长时间运行的操作而不需要用户交互。
这些操作可以是播放音乐、下载文件、上传日志等等。
Service是Android四大组件之一,它与Activity、BroadcastReceiver、Content Provider共同构成了Android应用程序的组成部分。
当我们开发Android应用程序时,会不可避免地遇到一些需要在后台运行一段时间的任务,这时就可以用到Service来解决这些问题。
Service的用途:1.执行一些耗时的任务,不会阻塞UI线程。
2.在后台接收和处理广播,并且不会为了响应广播而启动用户界面。
3.提供远程接口,用于与其他应用程序进行通信。
Android系统根据服务的工作状态,将Service分为两种类型:Started Service和Bound Service。
1.Started Service最常用的一种是Started Service,它是一种没有任何输入或输出数据流的服务,只负责执行一些计算或操作,这些操作不需要与应用程序的其他组件进行交互。
- onCreate()方法:当Service第一次创建时,系统会调用该方法,只会调用一次。
使用startService()方法启动Service。
startService()方法可以传递Intent作为参数,在Intent中可以携带数据。
Bound Service需要与其他组件进行交互,它可以被客户端连接和解绑。
客户端可以在Activity、Service、BroadcastReceiver里面创建与Bound Service的连接。
Bound Service通常需要提供一些公共方法供客户端调用。
Bound Service的生命周期:Service的生命周期分为创建、运行和销毁三个阶段。
【推荐下载】android四大组件之service
android 四大组件之service2016/02/21 2 Service 服务与Activity 有些像,就像个没有界面的activity,它也是Context 的子类,可以自定义一个类继承Service,它的生命周期如下:onCreate():第一次创建调用onStartCommand(Intent intent,int flags,int startId):通过startService 启动时才调用,每次启动都会调用onDestory():关闭时调用onBind(Intent intent):与程序通信使用,绑定service 只会调用一次onUnbind(Intent intent):与service绑定的连接全部断开时调用类注册activity,我们也要在配置文件中加入service标签,其也可以设置intent-filter 等,有两种方法可以启动service:Context.startService():启动service,但这种启动访问者即使退出该service 依然会运行,想终止可调用stopService(Intent intent)方法,由于访问者与service 无关联,因此不能通信或传数据Context.bindService():绑定service,访问者退出service 也会停止,unbindService 终止,可以进行通信bindService(Intent service,ServiceConnection conn,int flags);Intent 指定要启动的service,conn 主要用于监听连接情况,当service连接成功会调onServiceConnected(ComponentName name,IBinder service)方法,这里参数的IBinder 对象就是在onBind 方法返会的对象,因此想通信就靠它了,当service 终止会调onServiceDisconnected(ComponentName name)方法,flags 指定绑定时是否自动创建service,0 为不自动创建,BIND_AUTO_CREATE 为自动创建因此这两种方式的生命周期大概就是:startService:onCreate-onStartCommand- onDestorybindService:onCreate-onBind-onUnbind-onDestory 虽然service 看是独立的,但它并不是一个新的进程或线程,因此我们不能直接在里面进行耗时操作,如果要执行耗时操作则需要创建一个新线程IntentService 是Service 的子类,主要解决了在service 中不能直接执行耗时操作的问题,intentService 是用队列来管理intent,它会将intent 加入队列并开启新线程,这样不会造成主线程的阻塞。
Android Service的使用
服务的使用与知识点服务分为:本地服务、远程服务;区别:本地服务指的是服务提供者与调用者是在同一个程序中,远程服务是服务提供者与调用者是属于不同的程序。
服务的生命周期:onCreate()----->> onStartCommand()----->> onDestroy();如果服务已经开启,不会重复的执行onCreate(),而是会调用onStartCommand()方法,服务停止的时候会调用onDestory();绑定服务的时候是异步的,bindService();本地服务使用的方法:绑定本地服务调用方法的步骤:1.在服务的内部创建一个内部类提供一个方法,可以间接调用服务的方法private class MiddlePerson extends Binder implements IMiddlePerson{}2.实现服务的onbind方法,返回的就是中间人MiddlePerson3.在activity 绑定服务。
bindService();4.在服务成功绑定的时候会执行一个方法onServiceConnected 传递过来一个IBinder对象5.强制类型转化调用接口里面的方法。
一、服务的开启方法:1、使用Intent的方法:(一旦服务开启跟调用者(开启者)就没有关系了,开启者没有调用服务里的方法)Intent intent = new Intent(Context context, Class<?> cls);startService(intent);2、使用绑定的方式开启(调用者挂了,服务也会跟着挂掉,开启者可以调用服务里面的方法):MyConn conn = new MyConn();Intent intent = new Intent(Context context, Class<?> cls);bindService(intent,conn,BIND_AUTO_CREATE);private class MyConn implements ServiceConnection{// 当服务被连接的时候调用服务别成功绑定的时候调用@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {把service强制转换成接口类型的}//当服务失去连接的时候调用(一般进程挂了,服务被异常杀死)@Overridepublic void onServiceDisconnected(ComponentName name) {}}二、服务停止的方法:1.使用Intent的方法:Intent intent = new Intent(Context context, Class<?> cls);stopService(intent);2.使用解除绑定的方法:unbindService(conn);三、服务的定义:1、一个简单的服务定义(继承Service类):public class MyService extends Service {@Overridepublic IBinder onBind(Intent arg0) {return null;}@Overridepublic void onCreate() {super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {super.onDestroy();}}2、一个定义了方法的服务:定义一个接口:public interface 接口名{在这里定义要在服务里暴露出来的方法}定义一个服务:public class MyService extends Service {//实现服务成功绑定的代码,返回一个中间人。
Android Service使用详解
Android Service使用详解Service是Android系统中的四大组件之一,主要有两个应用场景:后台运行和跨进程访问。
Service可以在后台执行长时间运行操作而不提供用户界面,除非系统必须回收内存资源,否则系统不会停止或销毁服务。
服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。
此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信(IPC)需要注意的是,Service是在主线程里执行操作的,可能会因为执行耗时操作而导致ANR一、基础知识Service可以分为以下三种形式:启动当应用组件通过调用startService() 启动服务时,服务即处于“启动”状态。
一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响。
已启动的服务通常是执行单一操作,而且不会将结果返回给调用方绑定当应用组件通过调用bindService() 绑定到服务时,服务即处于“绑定”状态。
绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信(IPC) 跨进程执行这些操作。
多个组件可以同时绑定服务,服务只会在组件与其绑定时运行,一旦该服务与所有组件之间的绑定全部取消,系统便会销毁它启动且绑定服务既可以是启动服务,也允许绑定。
此时需要同时实现以下回调方法:onStartCommand()和onBind()。
系统不会在所有客户端都取消绑定时销毁服务。
为此,必须通过调用stopSelf() 或stopService() 显式停止服务无论应用是处于启动状态还是绑定状态,或者处于启动且绑定状态,任何应用组件均可像使用Activity 那样通过调用Intent 来使用服务(即使此服务来自另一应用),也可以通过清单文件将服务声明为私有服务,阻止其他应用访问要使用服务,必须继承Service类(或者Service类的现有子类),在子类中重写某些回调方法,以处理服务生命周期的某些关键方面并提供一种机制将组件绑定到服务onStartCommand()当组件通过调用startService() 请求启动服务时,系统将调用此方法(如果是绑定服务则不会调用此方法)。
android service的用法
在Android开发中,Service是一种用于在后台执行长时间运行操作的组件,而不提供用户界面的应用程序组件。
以下是使用Android Service的一些基本用法:1.定义Service类:创建一个继承自Service的类,并重写其中的一些方法来执行所需的操作。
例如,可以在Service中执行网络请求、文件读写等操作。
2.注册Service:在AndroidManifest.xml文件中注册Service,以便系统可以找到并启动它。
例如:php复制代码<service android:name=".MyService" />3.启动Service:在Activity或其他组件中,使用Context的startService()方法来启动Service。
例如:java复制代码Intent intent = new Intent(this, MyService.class);startService(intent);4.绑定Service:如果需要在Service和Activity之间进行通信,可以使用bindService()方法来绑定Service。
通过回调接口,可以在Service和Activity之间传递数据或执行操作。
5.处理生命周期:由于Service在后台运行,不受Activity的生命周期限制,因此需要处理其自身的生命周期。
在Service中重写onStartCommand()或onBind()方法来执行所需的操作,并在不再需要时调用stopSelf()方法来停止Service。
6.通知用户:如果需要在Service执行某些操作时通知用户,可以使用NotificationManager来发送通知。
例如,可以在Service中发送一个通知,告知用户数据已成功下载或上传。
需要注意的是,使用Service需要谨慎处理资源的释放和生命周期的管理,以避免内存泄漏和资源浪费。
android service用法
android service用法AndroidService是一种Android应用程序组件,它可以在后台运行,而不需要与用户界面交互。
Service 可以执行一些长时间运行的任务,例如下载文件、播放音乐等。
在本文中,我们将介绍 Android Service 的用法。
1. 创建 Service要创建一个 Service,您需要创建一个继承自 Service 类的Java 类。
您需要实现 onStartCommand() 或 onBind() 方法来指定服务的行为。
2. onStartCommand() 方法onStartCommand() 方法在每次启动服务时调用。
它接收 Intent 参数,该参数描述了启动服务的原因。
您可以通过检查 Intent 中的额外数据来确定服务应执行的操作。
例如,如果您的服务是用于下载文件的,则可以检查 Intent 中是否包含文件的 URL。
您需要在 onStartCommand() 方法中执行 Service 的操作。
这可能是 CPU 密集型或 I/O 密集型操作。
如果您的服务需要执行长时间运行的操作,则需要在后台线程中执行操作。
否则,您的服务将阻止 UI 线程。
3. onBind() 方法onBind() 方法在客户端通过 bindService() 方法绑定到服务时调用。
它返回一个 IBinder 对象,该对象允许客户端与服务进行通信。
通过 IBinder 对象,客户端可以调用服务的公共方法。
4. 生命周期管理Service 有三个生命周期方法:onCreate()、onStartCommand() 和 onDestroy()。
onCreate() 在第一次创建服务时调用。
onStartCommand() 在每次启动服务时调用。
onDestroy() 在服务被销毁时调用。
您可以在这些方法中执行服务的初始化、释放资源、清理操作等。
5. 启动 Service要启动一个 Service,您可以使用 startService() 方法。
Android 四大组件之Service
Android 四大组件之Service分类:程序语言|标签:Android|日期:2016-03-15 02:00:06---恢复内容开始---1,Service的生命周期onCreate第一次创建service的时候调用。
onStartCommand启动service的时候调用。
onStart(This method was deprecated in API level 5. Implement onStartCommand(Intent, int, int) instead.)onDestroy销毁的时候调用。
2,进程优先级(由高到低):(红色字体的两个进程是经常被系统回收的两个进程)1. Foreground process 前台进程用户正在操作的应用程序的进程.2. Visible process 可视进程用户可以看到, 但无法进行操作的应用程序的进程.3. Service process 服务进程后台运行的服务所在的进程.(如果有Activity再前台,则该进程属于前台进程)4. Background process 后台进程最小化应用程序, 托管到后台运行.5. Empty process 空进程已经退出的程序, 没有任务在运行.3,service的使用注意事项:1.是否可以在service里写一些费时操作?不能。
如果有耗时操作可能会导致ANR的发生。
(onReceive方法内是否可以写耗时操作?原因)原因是:service这些回调方法的代码是运行在主线程上的。
2.IntentService 该服务已经启动了一个线程,你不必再启动了。
你要做的事情直接写到onHandleIntent,它会在子线程里处理。
三道面试题:1.service和activity的区别。
1.activity可以和用户交互,service可以在后台做些事情而不用跟用户交互。
2.activity在退出程序后会退出,而对于service,如果没有显示的调用停止服务,那么服务就没有结束,它仍在后台运行。
Android服务Service使用总结
Android服务Service使用总结一.Service简介Service是Android 系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别差不多,但不能页面显示只能后台运行,并且可以和其他组件进行交互。
service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务总是藏在后台的,例如,一个service可能处理网络事物,播放音乐,执行文件I/O,或与一个内容提供者交互,所有这些都在后台进行。
我们一定要知道的是这里Service的后台运行并不是子线程。
Service的运行是在主线程中进行的,只是它没有界面显示而已,它的耗时操作同样需要开启子线程,否者会跟Activity一样出现ANR(application not response–程序没有响应)。
我们要知道的是主线程的内容包括UI和后台。
只要程序中的UI或后台其中一个在跑,程序都算是在运行状态。
(一)Service的创建和注册1.Service服务的创建必须要实现重写其中的onBind方法,可以在里面做各种操作,也可以接收传递过来的Intent 的数据做处理。
public class MyService extends Service {@Nullable@Overridepublic IBinder onBind(Intent intent) {System.out.println("MyService.onBind");return null;}}2.Service服务的注册,在AndroidManifest中注册<service android:name=".MyService" />服务的注册是四大组件中最简单的一个,一般只要设置name属性就可以了。
android start service
android service 之一(start service)博客分类:Android我们有两种方式(start与bind)启动一个Service,每一种方式启动的Service生命周期是不一样的,这篇贴子主要写的是start service。
它的生命周期中只有三个阶段:onCreate, onStartCommand(取代原来的onStart方法), onDestroy。
如下图:需要注意的有:①如果是调用者直接退出而没有调用stopService 的话,那么被启动的Service 会一直在后台运行,直至其stopService 方法被调用,或者它自己调用stopSelf 方法。
②在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStartCommand()方法。
如果调用startService()方法前服务已经被创建,那么会直接调用onStartCommand()方法。
也就是说,多次调用startService()方法并不会导致多次创建服务。
另外,不管被start 多少次,只需一次stop 便可将相应的service关闭。
③具体的操作应该放在onStartCommand() 里面以下通过截图来看:上图的中的四个按钮均是针对于同一个Service进行的操作,此时去application ,可以查看到"Running Service" 的列表如下:这个,我们去点击上面的按钮(分别点击startservice 1 和2 各两次),结果如下:从图中,我们可以看出,onCreate() 方法只在第一次创建服务的时候被调用了。
现在,通过“返回键”来退回至主界面,然后再去application 的running service中去查看,可得下面的截图:从此图中,我们可以看出,虽然Activity被finish掉了,但是由它启动的service仍然在后台运行着。
android如何获取service的实例
android如何获取service的实例在Android开发中,Service是一种后台运行的组件,可以用于执行一些长时间运行的任务或者提供特定的功能接口。
在某些情况下,我们可能需要获取Service的实例,以便与其进行交互或者获取相关信息。
本文将介绍几种方法来获取Service的实例。
1. 使用bindService()方法获取Service的实例bindService()方法可以用于绑定一个Service,并返回一个ServiceConnection对象,通过ServiceConnection对象可以获取到Service的实例。
具体步骤如下:Step 1:创建一个ServiceConnection对象,用于接收Service的实例。
```javaprivate ServiceConnection mConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// 在此处获取到Service实例MyService.MyBinder binder = (MyService.MyBinder) service;MyService myService = binder.getService();// 具体操作和交互代码}@Overridepublic void onServiceDisconnected(ComponentName name) {// Service连接断开后的处理逻辑}};```Step 2:调用bindService()方法绑定Service。
```javaIntent intent = new Intent(this, MyService.class);bindService(intent, mConnection, Context.BIND_AUTO_CREATE);```2. 使用startService()方法获取Service的实例startService()方法可以启动一个Service,并返回一个ComponentName对象,通过ComponentName对象可以获取到Service 的实例。
Android实现Service在前台运行服务
Android实现Service在前台运⾏服务前⾔在做⼿机⾳乐播放器的时候,让我⾮常苦恼的⼀件事就是⼿机有清理内存的软件,⽐如百度,360等等,⼀点击清理⾳乐就停⽌播放了,去后台查看发现Service已经被停⽌并重新启动了,这显然不是我想要的,我希望⾳乐能够在后台播放,并且⾃⼰能控制什么时候退出,不想让系统给我清理了,就像酷狗⼀直在通知栏显⽰那样,于是我就知道了在前台运⾏的服务。
实现我们先看⼀下结果图:这是运⾏在通知栏的界⾯,这样就是让服务在前台运⾏,再清理的时候就不会导致服务被关闭了。
好了,我们直接上代码,因为要开启服务,所以我们必须先要有⼀个Service的⼦类,然后在onCreate⾥⾯实现它。
MyService.javapublic class MyService extends Service {public static final String TAG = "MyService";@Overridepublic void onCreate() {super.onCreate();Notification notification = new Notification(R.drawable.ic_launcher,"有通知到来", System.currentTimeMillis());Intent notificationIntent = new Intent(this, MainActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,notificationIntent, 0);notification.setLatestEventInfo(this, "幻听", "许嵩",pendingIntent);startForeground(1, notification);}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {super.onDestroy();}@Overridepublic IBinder onBind(Intent intent) {return null;}}可以看到,在onCreate⽅法⾥⾯我们得到Notification的⼀个对象,然后调⽤startForeground(1, notification);⽅法来实现在前台运⾏。
AndroidService全解(一)之startService(转)
AndroidService全解(⼀)之startService(转)今天看到⼀篇不错的⽂章,与⼤家分享⼀下。
本系列⽂章的序介绍了Service的⼤概情况,本章详细介绍Service的启⽤运⾏⽅法。
运⾏Service的⽅法有2种,⼀种是使⽤startService(),另⼀种是使⽤bindService(),bindService()是⼀个⽐较复杂但⾮常有⽤的⽅法,关于bindService()的内容在这个系列的后⾯会详细讲解。
startService()是Android提供的启动Service的⽅法,任何继承于android.content.Context的Android组件(component)都可以使⽤⼀个Intent(android.content.Intent)来开启⼀个Service。
Intent⾥⾯可以以类对象(Class<?>)或者action进⾏构造,使⽤action构造对于初学者来说不太直观,⽽且action构造的适⽤范围⽐类对象构造使⽤范围更⼴,所以action构造的⽅法将在本系列⽂章后⾯的内容进⾏介绍,现在就都使⽤类对象进⾏构造。
如果Service并没有运⾏,则新建⼀个Service(这⾥涉及到Service指派Task的问题将在以后的内容中介绍),并运⾏之,相继Service的回调onCreate(),onStart()/onStartCommand()(onStartCommand()是在Android2.0及之后SDK加⼊推荐使⽤的,⽤来代替⽼版的onStart()⽅法)被调⽤;如果Service已经在运⾏了,则只有回调onStart()/onStartCommand()被调⽤。
参看Android官⽅⽂档可以发现,onStart()和onStartCommand()均会传⼊⼀个Intent对象参数,这个Intent对象就是使⽤startService()时传⼊的同⼀个Intent对象(同⼀个表⽰使⽤“==”⽐较返回true)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
onStartCommand(Intent intent, int flags, int startId)
Service原理这里不介绍,只介绍onStartCommand的返回和Android Reference中的问题。
onStartCommand方法必须具有一个整形的返回值,这个整形的返回值是一个描述性质的数值,用来告诉系统在服务启动完毕后,一旦遇到服务被系统销毁(System kill),系统将如何继续(操作),这些返回值必须是以下一个:
START_NOT_STICKY
如果系统在onStartCommand返回后被销毁,系统将不会重新创建服务,除非收到一个未处理(pending悬而未决地)的Intent,当不是必须(necessary)并且Android应用能够自行简单地(simply)重启未完成业务(不通过服务),那么这样的设定是最安全的(safest)。
START_STICKY
如果系统在onStartCommand返回后被销毁,系统将会重新创建服务并依次调用onCreate和onStartCommand(注意:根据测试Android2.3.3以下版本只会调用onCreate根本不会调用onStartCommand,Android4.0可以办到),重新创建的操作将会作为事件日程序列(schedule)加入到系统事件日程列表中,在延迟一个计算时间(如:5000ms)后重新启动。
但是不会重新将之前的传入的Intent创新传递给、
onStartCommand,除非重新收到一个未处理(pending悬而未决地)的Intent,在这种情况下(inwhich case),未处理的心得Intent仍然按照流程被传入和处理,但是前一次操作的Intent将会变null(等同于一次带null intent的启动)。
对于不需要立刻执行命令的服务,如多媒体播放器(或者其他类似(similar)的服务)那么这样的设定是非常适合的,但是服务会无限期的运行,并等待一个适合的工作(个人理解:就是服务等于又重新启动恢复到之前的状态了)。
START_REDELIVER_INTENT
同START_STICKY,在重新调用onStartCommand的时候,之前的Intent将会被保留,并重新传递给该方
法,除非此时出现了一次新的启动服务请求,那么Intent将会被替换成新的,否则仍然使用旧的Intent。
经过测试Android2.3.3对于该操作同样有效。
注意:以上行为只有在System kill event的情况下有效,stopSelf和stopService都不会过问onStartCommand的返回状态。
名词解释:
System kill:系统杀死服务,以释放内存,在低内存的情况下系统会自行操作,System kill之后的操作有onStartCommand的返回值决定,注意,正常结束服务是不会发生重启的,因为服务结束并不代表服务实例被释放,一个服务实例可以被多次启动,但是这并不表示产生了多个服务实例,从DDMS可以看到他们和hosting process使用同一个PID,服务实例是绑定在hosting process 主线程消息队列的(Message Queue)。