Android锁屏状态下service不能正常工作的探究

理想情况下例如音乐播放等service在锁屏状态下都是可以正常播放的。

最近在用android5.0做开发,写了蓝牙4.0的服务和socket的网络请求服务,需求是每隔一段时间自动查询服务器数据,如果有需要的数据传给蓝牙从机做相应处理。在锁屏状态下直接无效,解决措施:

打开WLAN,选择高级,WLAN休眠策略,选择不休眠、关闭等选项。

这样至少在锁屏后也可以进行网络通讯。

参考论坛:http://bbs.csdn.net/topics/391877495


至于锁屏后service被kill,查阅了很多资料都没有解决,大相径庭,但是实际操作没什么用,并且是直接被虚拟机kill的,跳过了service的onDestroy()。很多人在系统层上分析,分享一下这篇文章:http://www.cnblogs.com/andies/p/5893143.html


对于上面的情况,最暴力的方式就是禁止锁屏和休眠,但是会非常耗电。可参考下面这篇文章,感觉很牛逼,就是不知道5.0之后行不行:http://blog.csdn.net/chenyafei617/article/details/6575621


最后分享一下我的方法吧,首先服务为了满足需求,采用了bindService和startService两种方式启动,onStartCommand方法如下,使用了return START_STICKY以及startForeground两种方式防止service被kill。

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        NotificationManager nm = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setContentTitle("请不要锁屏")
                .setContentText("")
                .setWhen(System.currentTimeMillis())
                .setPriority(Notification.PRIORITY_MIN)
                .setSmallIcon(R.mipmap.ble_icon)
                .setAutoCancel(true);
        Notification notification = builder.build();
        startForeground(1, notification);
        return START_STICKY;
    }


如果不采用这种方式,bindService再锁屏情况大约4分钟后被杀死;这种方式在锁屏的情况下大约11分钟被杀死。但是已经不自动锁屏了,或者锁屏下10分钟内将屏幕点亮就没有问题。

你可能感兴趣的:(android)