如何让android的service一直在后台运行

如题所述

Started Service的生命周期:
onCreate():创建服务

onStartCommand():服务开始运行(在2.0以前版本中,使用onStart()回调方法)

onDestroy() :服务被停止

【详细说明:】
在程序中调用:context.startService() 会触发执行Service生命周期中的onCreate()、onStartCommand()回调方法,此时服务就开始正式运行;
如果Service还没有运行,则android先调用onCreate()然后调用onStartCommand();如果Service已经运行,则只调用onStartCommand(),所以一个Service的onStartCommand方法可能会重复调用多次;
如果在程序中调用:context.stopService()会触发执行Service生命周期中的onDestroy()回调方法,会让服务停止;
stopService()的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService()的话,Service会一直在后台运行。该Service的调用者再启动该Service后可以通过stopService关闭Service;stopSelf()
所以StartService的生命周期为:onCreate --> onStartCommand(可多次调用) --> onDestroy。

Service运行在后台,它是不可见的、无界面的程序 Service运行在主线程中;最好在Service中启动新线程来运行耗时的任务

为什么不使用后台线程而使用Service?
· 1、Service可以放在独立的进程中,所以更安全;
· 2、使用Service可以依赖现有的binder机制,不需要在应用层面上处理线程同步的繁杂工作;
· 3、系统可以重新启动异常死去的Service。
服务的分类
1本地服务 2远程服务
启动服务的方法
1)、 Context.startService()
调用者与服务之间没有关联,即使调用者退出,服务仍可运行
2)、 Context.bindService()
调用者与服务绑定在一起,调用者一旦退出,服务也就终止
a 本地服务的分类:
StartedService 被启动服务
被启动的服务是由其它组件调用startService()方法而启动的,onStartCommand()被回调,除非调用stopSelf()或stopService()来停止该服务。否则该服务还可以在后台无限期运行
BoundService 绑定服务
绑定服务是允许其它应用程序绑定并且与之交互的Service的实现类。为了提供绑定,必须实现onBind()回调方法。该方法返回IBinder对象,它定义了服务类与Activity交互的程序接口。
根据onStartCommand()的返回值还划分为:粘性服务和非粘性服务
· START_STICKY(常量值:1):sticky的意思是“粘性的”。使用这个返回值时,我们启动的服务跟应用程序"粘"在一起,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务。当再次启动服务时,传入的第一个参数将为null;
· START_NOT_STICKY(常量值:2):“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
· START_REDELIVER_INTENT(常量值:3):重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
b远程服务

远程服务是吧数据暴露出来 由其他应用程序调用
1、Started Service的生命周期:
· onCreate():创建服务
· onStartCommand():服务开始运行(在2.0以前版本中,使用onStart()回调方法)
· onDestroy() :服务被停止
调用startedservice会调用服务里的onstartedcommand方法 如果第一次调用会调用oncreate方法 。
调用stopservice会调用服务里的ondestroy()

2、Bound Service的生命周期:
· onCreate():创建服务
· onBind():绑定服务,服务开始运行
· onUnbind():取消绑定
· onDestroy() :服务被停止
· 在程序中调用:context.bindService()会触发执行Service生命周期中的onCreate()、onBind()回调方法,此时服务开始运行;
· onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。此后调用者(Context,例如Activity)会和Service绑定在一起;
· 如果调用Service的调用者Context退出了,那么会依次调用Service生命周期中的onUnbind()、onDestroy()回调方法,会让服务停止;
· 所以BindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。
· Service是不能自己启动
IntentService和Service
· 生成一个默认的且与主线程互相独立的工作者线程来执行所有传送至 onStartCommand() 方法的Intetnt
· 生成一个工作队列来传送Intent对象给你的onHandleIntent()方法,同一时刻只传送一个Intent对象,这样一来,你就不必担心多线程的问题。
· 在所有的请求(Intent)都被执行完以后会自动停止服务,所以,你不需要自己去调用stopSelf()方法来停止该服务
· 提供了一个onBind()方法的默认实现,它返回null
· 提供了一个onStartCommand()方法的默认实现,它将Intent先传送至工作队列,然后从工作队列中每次取出一个传送至onHandleIntent()方法,在该方法中对Intent对相应的处理
IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程。
这里就给我们提供了一个思路,如果有耗时的操作可以在Service里面开启新线程,也可以使用IntentService来处理耗时操作。 但你若是想在Service中让多个线程并发的话,就得使用第一种方法,在Service内部起多个线程,但是这样的话,你可要处理好线程的同步。
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-09-08
请搜索度娘谢谢。。呵呵

android常驻service(Android常驻通知)
如何让android的service一直在后台运行Android的service一直运行的方法:Intent.ACTION_TIME_TICK的使用我们知道广播的注册有静态注册和动态注册,但此系统广播只能通过动态注册的方式使用。START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。android如何让程式在后台执行可以使用S...

如何让android的service一直在后台运行
Android中Service一直在后台运动,需要在Service被kill后重新启动,这样实现一直在后台运行,同时还需要使用BroadcastReceiver来实现,即广播接收者,例如利用BroadcastReceiver注册网络广播或者开关机广播,当接收到广播后直接启动service,这样就可以保证service被kill后,自动启动。实现代码:1.在配置文件AndroidManifes...

如何让android的service一直在后台运行
Android的service一直运行的方法:1、 Intent.ACTION_TIME_TICK的使用 我们知道广播的注册有静态注册和动态注册,但此系统广播只能通过动态注册的方式使用。即你不能通过在manifest.xml里注册的方式接收到这个广播,只能在代码里通过registerReceiver()方法注册。在ThisApp extends Application 里注册广播:IntentF...

如何让android的service一直在后台运行
1. 把service和activity分开,让service开机启动。设置一个broadcast receiver接受开机信号,使用RECEIVE_BOOT_COMPLETED的permission, 然后启动service。activity启动后绑定到service上,通过ipc机制通信,acitivity结束后松绑。注意安装后要手动启动service,不会自动启动,之后重启手机后才会随开机启动。2. 在内存...

如何让android的service一直在后台运行
要让android的service一直在后台运行,是不可以的,具体解释如下:Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStartCommand方法中做一些处理,然后注意到这个函数有一个int的返回值。从Android官方文档中,可以知道onStart...

怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死
1、首先要保证你的程序一直在于后台运行,也就是所谓和守护程序一样,而且在任何认为kill和系统内存回收kill后,保证重启。2、获取系统内部资源。3、上报策略,间隔时间上报还是按月按天上报。4、监测网络,当网络开启的时候第一时间上报数据。5、服务器连接。对于以上问题的解决:1、利用广播Broadcast...

怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死
方法:对于一个service,可以首先把它设为在前台运行:public void MyService.onCreate() { super.onCreate();Notification notification = new Notification(android.R.drawable.my_service_icon,"my_service_name",System.currentTimeMillis());PendingIntent p_intent = PendingIntent.getActivity(this, 0...

怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死
双进程Service:让2个进程互相保护,其中一个Service被清理后,另外没被清理的进程可以立即重启进程 QQ黑科技:在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死 在已经root的设备下,修改相应的权限文件,将App伪装成系统级的应用(Android4.0...

怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死
如果在程序中调用:context.stopService()会触发执行Service生命周期中的onDestroy()回调方法,会让服务停止;stopService()的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService()的话,Service会一直在后台运行。该Service的调用者再启动该Service后可以通过stopService关闭Service;stopSelf()...

如何让Service尽可能存活
1.让Service杀不死。Service的onStartCommand返回START_STICKY,同时onDestroy里面调用startService启动自身。2.让Service从后台变成前置。在Android 2.0以前有效,借助setForeground(true)。3.让某个进程不被系统的low memory killer杀死(如数据缓存进程,或状态监控进程,或远程服务进程)。add android:...

相似回答