在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的应用程序中尝试并测试了这一点,甚至在某些设备(如禁用androidO
后台运行服务的诺基亚)中也从未停止过,但有了这一技巧,您可以让它继续运行。像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);
}
}