在android 9.0或更高版本上持续运行服务

在android 9.0或更高版本上持续运行服务,android,service,sms,backup,Android,Service,Sms,Backup,我的应用程序是关于备份SMS/MMS消息的 到目前为止,我的想法是在短信到达或发送时立即将其备份到一个XML文件, 然后定期将创建的XML文件上传到云存储,即使应用程序未运行 这种方法是我发现的唯一一种对我来说足够可靠,不会丢失任何对话的方法 所有这些功能基本上都完成了,但我注意到谷歌不允许服务在设备上持续运行 所以,我的问题是,有没有一种方法可以让服务在后台连续运行,而不会在一段时间后被杀死。我对前台服务不感兴趣,因为我不希望我的用户随时显示通知 这基本上是我的第一个应用,我甚至不确定我备份软

我的应用程序是关于备份
SMS/MMS
消息的

到目前为止,我的想法是在短信到达或发送时立即将其备份到一个
XML
文件, 然后定期将创建的XML文件上传到云存储,即使应用程序未运行

这种方法是我发现的唯一一种对我来说足够可靠,不会丢失任何对话的方法

所有这些功能基本上都完成了,但我注意到谷歌不允许
服务
在设备上持续运行

所以,我的问题是,有没有一种方法可以让
服务
后台
连续运行,而不会在一段时间后被杀死。我对
前台服务
不感兴趣,因为我不希望我的用户随时显示
通知

这基本上是我的第一个应用,我甚至不确定我备份软件的方法是否正确


我想知道我该如何解决这个问题。此时此刻我所关心的是,我的应用程序将在
发送
接收
上立即备份每个对话。您可以在您的服务中使用
android.permission.BIND\u NOTIFICATION\u LISTENER\u服务
权限 但您必须向用户请求权限,还必须请求android.permission。请求“doze mode”的“忽略电池优化”权限,然后在服务中为您的
广播接收器使用
线程
。这种方式可以保证您的服务始终运行,但会延长电池寿命。我已经在api级别19到28的应用程序中尝试并测试了这一点,甚至在某些设备(如禁用android
O
后台运行服务的诺基亚)中也从未停止过,但有了这一技巧,您可以让它继续运行。像GameBooster或Cleaner这样的应用程序也使用这个技巧来保持服务alwyase的运行

更新:

   <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
    <service
        android:name=".Service.NLService"
        android:enabled="true"
        android:exported="true"
        android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
        >
        <intent-filter>
            <action android:name="android.service.notification.NotificationListenerService" />
        </intent-filter>
    </service>
请求许可

private static final String ACTION_NOTIFICATION_LISTENER_SETTINGS = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS";

public void askForNotificationServicePermission() {

        context.startActivity(new Intent(ACTION_NOTIFICATION_LISTENER_SETTINGS));

}

public void askForDozeModePermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Intent intent = new Intent();
        String packageName = context.getPackageName();
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
            intent.setData(Uri.parse("package:" + packageName));
            context.startActivity(intent);

    }
}

doSomeThing(本)
是您希望运行的某个方法,例如BroudCastereceiver。

您能提供一些代码示例吗?我已经实现了您的解决方案,并对其进行了5-6小时的测试,serice已启动并为其他有相同问题的人运行。
private static final String ACTION_NOTIFICATION_LISTENER_SETTINGS = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS";

public void askForNotificationServicePermission() {

        context.startActivity(new Intent(ACTION_NOTIFICATION_LISTENER_SETTINGS));

}

public void askForDozeModePermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Intent intent = new Intent();
        String packageName = context.getPackageName();
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
            intent.setData(Uri.parse("package:" + packageName));
            context.startActivity(intent);

    }
}