Android长时间后台运行Service
2016-09-21 16:24
399 查看
项目需要在后台获取GPS经纬度。当用户对手机有一段时间没有操作后,屏幕(Screen)将从高亮(Bright)变为暗淡(Dim),如果再过段时间没操作,
屏幕(Screen)将又由暗淡(Dim)变为不显示(Off),如果再过段时间没操作,CPU将sleep,从on变为off.这时服务会被杀死。
输出log:
网络给出很多种解决方法有横竖屏还有输入输出没close,创建太多对象等,但是发现不做任何实质操作只开启一个服务,锁屏后一段时间也会出现上面log。
之后尝试过:
1.休眠后,手机闹钟服务定时触发后台服务无效。
2.长时间休眠后,注册动态广播监听app被移除无效。
3.长时间休眠后,后台服务被销毁时触发重启服务无效,根本没有进入ondestory()方法。
4.WAKE_LOCK无效。
还有就是一个解决办法是开启前台服务但是会一直有通知。最后综合思路是:
1监听用户锁屏。
2.锁屏时打开前台广播,解锁时打开后台广播。
监听用户锁屏时必须是动态注册在manifest中无效。
然后就是前台服务就是在service的onStartCommand中加入
startForeground(1, notification);方法中参数是0,前台服务是无效的;传1是有效的。所以监听锁屏时,锁屏开启服务传1。这样service是前台的一直运行,但是看不到通知。屏幕亮时服务传0,service不容易被杀死。
屏幕(Screen)将又由暗淡(Dim)变为不显示(Off),如果再过段时间没操作,CPU将sleep,从on变为off.这时服务会被杀死。
输出log:
网络给出很多种解决方法有横竖屏还有输入输出没close,创建太多对象等,但是发现不做任何实质操作只开启一个服务,锁屏后一段时间也会出现上面log。
之后尝试过:
1.休眠后,手机闹钟服务定时触发后台服务无效。
2.长时间休眠后,注册动态广播监听app被移除无效。
3.长时间休眠后,后台服务被销毁时触发重启服务无效,根本没有进入ondestory()方法。
4.WAKE_LOCK无效。
还有就是一个解决办法是开启前台服务但是会一直有通知。最后综合思路是:
1监听用户锁屏。
2.锁屏时打开前台广播,解锁时打开后台广播。
监听用户锁屏时必须是动态注册在manifest中无效。
IntentFilter screenStateFilter = new IntentFilter(); screenStateFilter.addAction(Intent.ACTION_SCREEN_ON); screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF); registerReceiver(MyBroadCastReciever, screenStateFilter) BroadcastReceiver MyBroadCastReciever = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { Log.i("application", "Screen went OFF"); Toast.makeText(context, "screen OFF", Toast.LENGTH_LONG).show(); } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { Log.i("application", "Screen went ON"); Toast.makeText(context, "screen ON", Toast.LENGTH_LONG).show(); } } };
然后就是前台服务就是在service的onStartCommand中加入
NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); mBuilder.setPriority(Notification.PRIORITY_MIN);// 设置该通知优先级 // mBuilder.setSmallIcon(R.drawable.gpsblue); Notification notification = mBuilder.build(); startForeground(1, notification);
startForeground(1, notification);方法中参数是0,前台服务是无效的;传1是有效的。所以监听锁屏时,锁屏开启服务传1。这样service是前台的一直运行,但是看不到通知。屏幕亮时服务传0,service不容易被杀死。
相关文章推荐
- 判断Android后台服务线程(Service类)是否正在运行
- android 后台服务长时间运行---解决方案
- 如何让android的service一直后台运行
- Android中使用IntentService运行后台任务
- 如何检查Android后台服务线程(Service类)是否正在运行
- 如何让android的service一直在后台运行
- Android实现简单音乐播放器(startService和bindService后台运行程序)
- Android学习小记-----监听并保存传感器数据,让service后台运行(保持CPU运转
- android 后台运行service实现和后台的持续交互
- 如何检查后台服务(Android的Service类)是否正在运行?
- Android判断后台Service服务是否运行,获取所有的服务
- 如何检查后台服务(Android的Service类)是否正在运行?
- 如何检查Android后台服务线程(Service类)是否正在运行
- Android 启动后台运行程序(Service)
- android上app后台运行的相关知识(一)————android的四大组件:Activity、Service、BroadCast Recevicer、Content provider
- 如何让android的service一直在后台运行?
- Android判断后台服务(Service)是否运行
- Android中使用IntentService运行后台任务
- Android service(无论前后台) 后台(其应用不在屏幕)运行一段时间后被屏蔽了网络
- Android课程---关于Service的学习(后台运行)