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

问题描述 投票:0回答:1

我的应用程序即将备份SMS/MMS消息。

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

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

用于完成大部分功能的功能,但我注意到Google不允许在设备上将service设置为running continuously

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

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

我很乐意提供一些意见,我应该如何解决这个问题。我目前关心的是我的应用程序将立即备份sendreceive上的每个对话。

android service sms backup
1个回答
1
投票

您可以在服务中使用android.permission.BIND_NOTIFICATION_LISTENER_SERVICE权限但是您必须先向用户请求权限,然后还要为“打ze模式”提供android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限,然后在服务中为Thread使用BroadCastReceiver。这样可以确保服务始终运行,但是会消耗电池寿命。我已经针对从api级19到28的我的应用程序进行了尝试和测试,即使在某些设备(如禁用了诺基亚O后台运行服务的诺基亚)中也从未停止过,但是使用此技巧,您可以使其保持运行状态。诸如Gameboosters或Cleaners之类的应用程序也使用此技巧来使服务alwyase保持运行状态。

UPDATE:

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

© www.soinside.com 2019 - 2024. All rights reserved.