在 Android 上保持后台服务活动

Keeping a background service alive on Android

参照

我正在使用 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;
    }
}

class 中还有许多其他功能和诸如此类的东西,显然,从技术上讲,一切正常,除了不管我 return 是什么标志(START_STICKY,START_STICKY_COMPATIBILITY、START_NOT_STICKY 或 START_REDELIVER_INTENT),该服务在 5 到 25 分钟之间的任何时间后被终止,并且在下次启动之前不会重新启动。

我已经阅读了很多关于 Android 4.2 引入新的电池优化以终止后台进程的内容,并且我已经阅读了各种 START_STICKY 不再工作的错误报告,但是各种解决方法似乎对我的情况没有任何影响。不确定我是否试图错误地实施它们,或者这些解决方法是否刚刚在更新的版本中停止工作。我的测试设备是 运行 5.1.1.

我在这里有点不知所措,希望能再次提供帮助。

编辑 对于遇到此问题的任何其他人,下面接受的答案包括一个有效的唤醒锁,它使服务在 Nexus 7 运行 Android 5.1.1 和 LG G4 运行 Android 上保持活动状态6.

此外,在清单文件的 android:process 属性前加上冒号似乎对于保持唤醒锁就位很重要。参考 http://developer.android.com/guide/topics/manifest/service-element.html

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

要让服务持续存在,您只需要做的就是:

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

2) onStartCommand 应该 return:

 return Service.START_STICKY;

这就是我从主服务器启动服务后的全部内容 activity 它开启了一整天/

您需要在服务中使用部分 Wakelock。如果您的服务是与用户交互的,您可以考虑将服务放在前台。

这是部分唤醒锁的工作示例:

服务启动时使用:

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

服务停止后,调用cpuWakeLock.release();

imports android.support.v4.content.WakefulBroadcastReceiver which Android Studio is telling me doesn't exist.

您需要为此导入 support library

要做到这一点,请使用 JobScheduler 和 JobService,它们允许您定期执行代码。

首先创建一个扩展 JobService 的 class,然后实现所需的方法并从 JobService onStartJob() 方法中添加您的服务 code/start 另一个服务.

下面是一个定期执行 JobService 操作的示例:

ComponentName serviceComponent = new ComponentName(context, yourJobService.class);
JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); 
builder.setRequiresDeviceIdle(false); 
builder.setRequiresCharging(false); 
builder.setPeriodic(60000); // <<<<----  60 seconds interval

JobScheduler jobScheduler = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(builder.build());

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

祝你好运!