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

Running service on android 9.0 or higher continuously

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

到目前为止,我的想法是在文件到达或发送时立即将 SMS/MMS 备份到 XML 文件, 然后定期将创建的 XML 文件上传到云存储,即使应用不是 运行ning.

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

完成所有工作的功能大部分都已完成,但我注意到 google 不允许 service 在设备上 running continuously

所以,我的问题是,有没有办法让 service 运行 在 background 中连续进行,而不会在一段时间后被杀死。我对 foreground services 不感兴趣,因为我不希望我的用户一直显示 notification

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

我很想知道我应该如何解决这个问题。此时此刻,我只关心我的应用程序会立即备份 sendreceive 上的每个对话。

您可以在您的服务中使用 android.permission.BIND_NOTIFICATION_LISTENER_SERVICE 权限 但是您必须征得用户的许可,并且还征得 android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 对 "doze-mode" 的许可,然后在 BroadCastReceiver 的服务中使用 Thread。这种方式保证您的服务始终 运行ning,但会耗费电池寿命。我已经为我的应用程序从 api-level 19 到 28 尝试并测试了这个,即使在某些设备上也从未停止过,比如诺基亚 android O background 运行ning 服务禁用但是使用此技巧,您可以将其保留 运行ning。 Gameboosters 或 Cleaners 等应用程序也使用此技巧来保持服务始终 运行ning.

更新:

   <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>

服务

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public class NLService extends NotificationListenerService {

    private static final String TAG = NLService.class.getSimpleName();

    @Override
    public void onCreate() {
        super.onCreate();
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true)
                    try {
                        doSomeThing(NLService.this);
                        Thread.sleep(6000);
                    } catch (Exception ignore) {
                    }
            }
        }).start();

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {

        doSomeThing(this);
    }

    @Override
    public void onNotificationRemoved(StatusBarNotification sbn) {

        doSomeThing(this);
    }

请求许可

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(this); 是您想要 运行 的一些方法,例如您的 broudcastreceiver。