在Android上保持后台服务的活跃

时间:2016-02-14 14:52:44

标签: android android-intent service android-service

参考Accelerometer seems to only work for a few seconds?

我正在使用BOOT_COMPLETED广播事件来调用以下内容:

public class OnBootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent service = new Intent(context, ShakeEventService.class);
        context.startService(service);
    }
}

反过来又称之为:

public class ShakeEventService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        sManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        sensor = sManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sManager.registerListener(thisSensorEventListener, sensor, SensorManager.SENSOR_DELAY_NORMAL);

        return Service.START_STICKY;
    }
}

有很多其他的功能和诸如此类类里,很明显,和技术上的一切工作正常,但不管我回什么旗(START_STICKY,START_STICKY_COMPATIBILITY,START_NOT_STICKY,或START_REDELIVER_INTENT),该服务正在之间的任何位置后被杀5分钟和25分钟,直到下次启动才重新启动。

我已经阅读了很多关于Android 4.2引入新的电池优化以消除后台进程的内容,并且我已经阅读了START_STICKY不再有效的各种错误报告,但各种解决办法似乎没有做任何事情在我的情况下的差异。不确定我是否正在尝试错误地实现它们,或者这些变通办法是否已停止在更新的版本中工作。我的测试设备正在运行5.1.1。

我在这里有点不知所措,请再次感谢一些帮助。

EDIT 对于遇到这个问题的其他人来说,下面接受的答案包括一个工作的唤醒锁,它可以让运行Android 5.1.1的Nexus 7和运行Android 6的LG G4保持服务。

此外,使用冒号为清单文件的android:process属性添加前缀对于保持wakelock到位似乎很重要。参考http://developer.android.com/guide/topics/manifest/service-element.html

虽然运行相同的Android 5.1.1的三星S6 Edge仍然没有运气,所以看起来三星在他们的电池优化中实施了导致过早杀死的东西..

3 个答案:

答案 0 :(得分:3)

要想拥有一个充满活力的服务,你所要做的就是:

<!-- BackGroundService Service -->
    <service
        android:name="com.settings.BackgroundService"
        android:enabled="true"
        android:exported="false"
        android:process=":my_process" />

2)onStartCommand应返回:

 return Service.START_STICKY;

在我从主要活动开始服务一整天后,所有伙伴都是

答案 1 :(得分:2)

您需要对服务使用部分Wakelock。如果您的服务是与用户交互的,您可以考虑使服务成为前台。

这是Partial Wakelock的一个工作示例:

启动服务时使用此功能:

    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock cpuWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
    cpuWakeLock.acquire();

当服务停止时,请拨打cpuWakeLock.release();

  

导入android.support.v4.content.WakefulBroadcastReceiver   Android Studio告诉我不存在。

您需要为此导入support library

答案 2 :(得分:0)

要使用JobScheduler和JobService,您可以定期执行代码。

首先创建一个扩展JobService的类,然后实现所需的方法并添加服务代码/从JobService onStartJob ()方法中启动另一个服务。

以下是定期执行JobService操作的示例:

self.inventory['weapons'].append(CreateWeapon.generate())

您可以在此处找到更多信息: https://developer.android.com/reference/android/app/job/JobService.html

祝你好运!