如何在Android

时间:2018-12-13 21:04:46

标签: android android-service android-background

我梦night以求地在可永久运行的android上创建一个简单的后台服务。

此服务将执行一些后台任务,例如池用户社交媒体并显示通知,因此它只需要一个用户交互(登录),此后便可以永久运行直到一天结束。...

但没有发生

这是我的清单:

<service
        android:name=".service.MyService"
        android:description="@string/serviceDescription"
        android:directBootAware="false"
        android:enabled="true"
        android:exported="false"
        android:icon="@drawable/ic_logo"
        android:label="@string/serviceLabel"/>

我从Application onCreate()开始服务

    if (MyService.getInstance() == null) {
        Intent intent = new Intent(this, MyService.class);
        startService(intent);
    }

服务:

public void onCreate() {
        super.onCreate();
        this.workDone = 0;

        this.workerMap = new HashMap<User.UserData, Worker>(3);
        this.listeners = new HashMap<Worker, Worker.WorkerListener>(3);
        this.usernames = new HashMap<APIFacade, List<String>>(3);

        this.threadPool = Executors.newFixedThreadPool(3);
        INSTANCE = this;

    }

在我的代码中绝对没有,我叫停服务,也叫停服务

那为什么在某些随机情况下我会得到nullpointerexception?

甚至有人告诉我做下面的代码来强制android“重新启动”服务

  @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

有人可以帮我吗……我对这个问题感到非常压力

我的应用程序每天有1000多个用户,其中大约10%的用户在使用该服务时“找到了一种方法”来创建nullpointerexception

2 个答案:

答案 0 :(得分:3)

奥雷奥(Oreo)改变了许多后台服务的内部(或者是牛轧糖?)。我会熟悉Android文档:

https://developer.android.com/about/versions/oreo/background

https://developer.android.com/training/best-background

您可能要考虑使用JobScheduler框架。

答案 1 :(得分:0)

答案是:您不能! 当前的Android 100%禁止开发人员提供永久服务。
直到KitKat为止,这样做在某种程度上是可行的(但并不完全可靠)。

从永久性服务中获得的最接近的服务是使用前台服务,该服务是从服务内部使用startForeground() method并在启动服务时使用startServiceForeground() method(在API 26及更高版本上)。
但是即使那样,该服务仍会在某个时刻被终止。

替代方法是:

  • 使用WorkManager进行“偶尔一次”任务(听起来像您所描述的可行选择)
  • AlarmManager在特定时间执行任务
  • 用户FCM(推送消息)执行服务器通知时执行的任务。