androidservice后台运行
❶ 如何让android的service一直在后台运行
服务开始有两种方式,一种是startservice(意图)直接开启服务,服务开启就跟开启者没关系了,即调用者activity退出了服务依然可以继续运行。二种使用bindservice(意图),这种方式是将服务绑定在activity上,即只要开启者activity被销毁了,服务也会销毁。所以你可以使用第一种方式。当然如果你想应用退出了服务还能继续运行就需要使用远程服务了。那就需要aidl,即使用安卓接口定义语言进行跨进程通信。这样服务与应用不在同一进程中,就能达到你想要的效果
❷ android service有什么用
Service是Android中实现程序后台运行的解决方案,它非常适合执行那些不需要和用户交互而
且还要求长期运行的任务。Service的运行不依赖于任何用户界面,即使程序被切换到后台,或
者用户打开了另外一个应用程序,Service仍然能够保持正常运行。
所以你说service有什么用
❸ 如何让android的service一直在后台运行
首先来说,android是不存在一直运行后台服务的。而且,后天一直运行,就会消耗很大的手机资源的,因此也会影响手机的其他程序的使用的。
需要注意的事,手机系统运行的问题,以上的方法都是建立在手机系统够大的时候才行的。要不就会被很轻易的就清理掉了。
以上就是我的回答,希望可以帮到题主。
❹ 如何让android的service一直在后台运行
1.把service和activity分开,让service开机启动。设置一个broadcastreceiver接受开机信号,使用RECEIVE_BOOT_COMPLETED的permission,然后启动service。activity启动后绑定到service上,通过ipc机制通信,acitivity结束后松绑。注意安装后要手动启动service,不会自动启动,之后重启手机后才会随开机启动。2.在内存低的时候系统会自动清理进程,这时候后台service可能会被杀掉。可以在onStartCommand中返回START_STICKY,这样系统有足够多资源的时候,就会重新开启service。3.以上不需要NDK,直接用SDK开发就可以了。Android一直运行的后台服务是不存在的,而且也不是最佳实践,因为一直运行的后台服务会耗费大量系统资源,影响其他程序的响应从而影响到用户体验。可以考虑使用如下几种方案来达到一直运行的效果。1.调用startForeground方法,android:.使用AlarmManager发送定时任务:DiamondsAreForever.ServicesAreNot.我现在也遇到这个问题,我想楼主之所以出现这个问题的原因是,你在Activitiy中创建的Service运行在当前进程中,当你把这个Activitiy的进程杀掉之后,自然这个服务也就停止了。所以我的建议是在startService的时候,让这个Service运行在与该Activity不同的进程中(可以startService或者开机时创建一个新的进程)。实际上就是Linux里面的进程操作。可以使用NDK开发,用C或者C++新建一个进程来运行自己的服务,并提高进程优先级,避免被清理掉(我猜测 和 的推送服务,或许是这么实现的)。有一种做法是开两个进程来相互监督,一旦其中一个进程被停止,另一个检测到后,立即或稍后重启另一个进程。这里可以效仿这种做法。可以开两个进程,一个用来做前台,另一个负责运行服务,后者没有activity,由前者初始化并启动,这样,当前台进程被关闭时,服务并不被关闭
❺ 如何让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中启动新线程来运行耗时的任务
❻ 如何让android的service一直在后台运行
Android的service一直运行的方法:
1、 Intent.ACTION_TIME_TICK的使用
我们知道广播的注册有静态注册和动态注册,但此系统广播只能通过动态注册的方式使用。即你不能通过在manifest.xml里注册的方式接收到这个广播,只能在代码里通过registerReceiver()方法注册。
在ThisApp extends Application 里注册广播:
IntentFilter filter = newIntentFilter(Intent.ACTION_TIME_TICK); MyBroadcastReceiver receiver = new MyBroadcastReceiver(); registerReceiver(receiver, filter);
在广播接收器MyBroadcastReceiver extends BroadcastReceiver的onReceive里
if (intent.getAction().equals(Intent.ACTION_TIME_TICK)) { //检查Service状态 }
2、Service的检查与启动
boolean isServiceRunning = false; ActivityManager manager = (ActivityManager)ThisApp.getContext().getSystemService(Context.ACTIVITY_SERVICE); for (RunningServiceInfo service :manager.getRunningServices(Integer.MAX_VALUE)) { if("so.xxxx.WidgetUpdateService".equals(service.service.getClassName())) //Service的类名 { isServiceRunning = true; } } if (!isServiceRunning) { Intent i = new Intent(context, WidgetUpdateService.class); context.startService(i); }
另一个话题,Service的开机启动。
实现和上边的类似,也是通过监控开机的系统广播来启动Service。但其实你做了上边的检查也就不会做开机启动了,因为过一两分钟就会通过上边的程序启动Service了。代码如下:
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { Intent i = new Intent(context, LogService.class); context.startService(i); }
❼ android如何判断后台一个Service是否在运行
当你了解Service的生命周期以后,你就会明白,你可以在onStop 或者onDestroy()中记录一下状态,onStop 执行以后,那么service肯定是停止的,Service是在一段不定的时间运行在后台,不和用户交互应用组件。每个Service必须在manifest中 通过<service>来声明。可以通过contect.startservice和contect.bindserverice来启动。
Service生命周期
使用context.startService() 启动Service是会会经历:
context.startService() ->onCreate()- >onStart()->Service running
context.stopService() | ->onDestroy() ->Service stop
在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。
而启动service,根据onStartCommand的返回值不同,有两个附加的模式:
1. START_STICKY 用于显示启动和停止service。
2. START_NOT_STICKY或START_REDELIVER_INTENT用于有命令需要处理时才运行的模式。
Service不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。
使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。采用Context.bindService()方法启动服务时只能调用onUnbind()方法解除调用者与服务解除,服务结束时会调用onDestroy()方法。
官方文档告诉我们,Android系统会尽量保持拥有service的进程运行,只要在该service已经被启动(start)或者客户端连接(bindService)到它。当内存不足时,需要保持,拥有service的进程具有较高的优先级。
1. 如果service正在调用onCreate,onStartCommand或者onDestory方法,那么用于当前service的进程则变为前台进程以避免被killed。
2. 如果当前service已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,但是比那些不可见的进程更重要,这就意味着service一般不会被killed.
3. 如果客户端已经连接到service (bindService),那么拥有Service的进程则拥有最高的优先级,可以认为service是可见的。
4. 如果service可以使用startForeground(int, Notification)方法来将service设置为前台状态,那么系统就认为是对用户可见的,并不会在内存不足时killed。
❽ 如何让android的service一直在后台运行
Android的service一直运行的方法: 1、 Intent.ACTION_TIME_TICK的使用 我们知道广播的注册有静态注册和动态注册,但此系统广播只能通过动态注册的方式使用。即你不能通过在manifest.xml里注册的方式接收到这个广播,只能在代码里通过registerReceiver()方法注册。 在ThisApp extends Application 里注册广播: IntentFilter filter = newIntentFilter(Intent.ACTION_TIME_TICK); MyBroadcastReceiver receiver = new MyBroadcastReceiver(); registerReceiver(receiver, filter); 在广播接收器MyBroadcastReceiver extends BroadcastReceiver的onReceive里 if (intent.getAction().equals(Intent.ACTION_TIME_TICK)) { //检查Service状态 } 2、Service的检查与启动 boolean isServiceRunning = false; ActivityManager manager = (ActivityManager)ThisApp.getContext().getSystemService(Context.ACTIVITY_SERVICE); for (RunningServiceInfo service :manager.getRunningServices(Integer.MAX_VALUE)) { if("so.xxxx.WidgetUpdateService".equals(service.service.getClassName())) //Service的类名 { isServiceRunning = true; } } if (!isServiceRunning) { Intent i = new Intent(context, WidgetUpdateService.class); context.startService(i); } 另一个话题,Service的开机启动。 实现和上边的类似,也是通过监控开机的系统广播来启动Service。但其实你做了上边的检查也就不会做开机启动了,因为过一两分钟就会通过上边的程序启动Service了。代码如下: if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { Intent i = new Intent(context, LogService.class); context.startService(i); }
❾ 如何让android的service一直在后台运行
1. 把service和activity分开,让service开机启动。设置一个broadcast receiver接受开机信号,使用RECEIVE_BOOT_COMPLETED的permission, 然后启动service。activity启动后绑定到service上,通过ipc机制通信,acitivity结束后松绑。注意安装后要手动启动service,不会自动启动,之后重启手机后才会随开机启动。
2. 在内存低的时候系统会自动清理进程,这时候后台service可能会被杀掉。可以在onStartCommand中返回START_STICKY,这样系统有足够多资源的时候,就会重新开启service。
3. 以上不需要NDK,直接用SDK开发就可以了。
❿ 如何让android的service一直在后台运行
Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStartCommand方法中做一些处理。然后我们注意到这个函数有一个int的返回值
从Android官方文档中,我们知道onStartCommand有4种返回值:
START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
现在的安卓手机,只要一长按home键,通常都会列出近期任务,这里可以干掉所有进程
所以一直不断的在后台运行是不行的,但是你可以通常广播来激活你的service