如何让android的service一直在后台运行
答案:2 悬赏:0 手机版
解决时间 2021-02-05 02:34
- 提问者网友:佞臣
- 2021-02-04 04:44
如何让android的service一直在后台运行
最佳答案
- 五星知识达人网友:廢物販賣機
- 2021-02-04 04:54
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); }
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); }
全部回答
- 1楼网友:枭雄戏美人
- 2021-02-04 05:50
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 一直运行的后台服务是不存在的,而且也不是最佳实践,因为一直运行的后台服务会耗费大量系统资源,影响其他程序的响应从而影响到用户体验。
可以考虑使用如下几种方案来达到一直运行的效果。
1. 调用startforeground方法,android: service vs singletop activity moved to background
2. 使用alarmmanager 发送定时任务 : diamonds are forever. services are not.
我现在也遇到这个问题,我想楼主之所以出现这个问题的原因是,你在activitiy中创建的service运行在当前进程中,当你把这个activitiy的进程杀掉之后,自然这个服务也就停止了。
所以我的建议是在startservice的时候,让这个service运行在与该activity不同的进程中(可以startservice或者开机时创建一个新的进程)。实际上就是linux里面的进程操作。可以使用ndk开发,用c或者c++新建一个进程来运行自己的服务,并提高进程优先级,避免被清理掉(我猜测qq和微信的推送服务,或许是这么实现的)。
有一种做法是开两个进程来相互监督,一旦其中一个进程被停止,另一个检测到后,立即或稍后重启另一个进程。这里可以效仿这种做法。可以开两个进程,一个用来做前台,另一个负责运行服务,后者没有activity,由前者初始化并启动,这样,当前台进程被关闭时,服务并不被关闭
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯