如何使 Android 应用程序始终在后台运行?

我用的是机器人设备。当我打开 Settings > Apps > Running时,在屏幕的左上角有一个选项可以看到: (1)运行进程(2)缓存的后台进程。我想运行的应用程序总是(24 × 7)不幸地被列在(2)缓存后台进程下,我想它/他们被列在(1)运行进程下(如果可能的话)。能做到吗?或者简而言之,如何让一个 Android 应用程序始终在后台运行?

我希望我传达了这个问题: -)

277239 次浏览

必须在 Application 类中启动一个服务才能始终运行它。 如果您这样做,您的服务将始终运行。即使用户从任务管理器终止你的应用程序或强制停止你的应用程序,它将重新开始运行。

创建服务:

public class YourService extends Service {


@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// do your jobs here
return super.onStartCommand(intent, flags, startId);
}
}

创建一个 Application 类并启动服务:

public class App extends Application {


@Override
public void onCreate() {
super.onCreate();


startService(new Intent(this, YourService.class));
}
}

将“ name”属性添加到 AndroidManifest.xml 的“ application”标记中

android:name=".App"

另外,不要忘记在 AndroidManifest.xml 的“ application”标记中添加服务

<service android:name=".YourService"/>

以及“清单”标记中的这个权限请求(如果 API 级别为28或更高) :

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

更新

在安卓奥利奥之后,谷歌引入了一些背景限制。因此,上述解决方案可能不会起作用。当用户从任务管理器中删除应用程序时,Android 系统也会删除您的服务。如果要运行一个服务,该服务总是在后台活动。您必须运行一个显示正在进行的通知的前台服务。因此,像下面这样编辑你的服务。

public class YourService extends Service {


private static final int NOTIF_ID = 1;
private static final String NOTIF_CHANNEL_ID = "Channel_Id";


@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}


@Override
public int onStartCommand(Intent intent, int flags, int startId){


// do your jobs here


startForeground();
        

return super.onStartCommand(intent, flags, startId);
}


private void startForeground() {
Intent notificationIntent = new Intent(this, MainActivity.class);


PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
notificationIntent, 0);


startForeground(NOTIF_ID, new NotificationCompat.Builder(this,
NOTIF_CHANNEL_ID) // don't forget create a notification channel first
.setOngoing(true)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(getString(R.string.app_name))
.setContentText("Service is running background")
.setContentIntent(pendingIntent)
.build());
}
}

编辑: 限制原始设备制造商

不幸的是,一些原始设备制造商(小米,一加,三星,华为等)限制后台操作,因为提供更长的电池寿命。这些原始设备制造商没有合适的解决方案。用户需要允许一些特定于 OEM 的特殊权限,或者他们需要通过设备设置将您的应用程序添加到白名单应用程序列表中。您可以从 https://dontkillmyapp.com/中找到更多详细信息。

如果后台操作对您来说是一种义务,那么您需要向您的用户解释为什么您的特性无法工作,以及他们如何通过允许这些权限来启用您的特性。我建议您使用自动启动程序库(https://github.com/judemanutd/AutoStarter) ,以便重定向您的用户关于权限页轻松从您的应用程序。

顺便说一下,如果你需要运行一些周期性的工作,而不是有连续的后台作业。你最好看看 WorkManager (https://developer.android.com/topic/libraries/architecture/workmanager)

在一些像我这样的手机上(MIUI Redmi 3) ,你可以在任务管理器中终止应用程序时不停止应用程序的列表中添加特定的应用程序(它会停止但会重新启动)

只需进入设置 > 权限自动启动

在体内和体内使用上述溶液是不够的。您必须 还有告诉用户手动添加权限。 你可以通过在手机设置中打开正确的位置来帮助他们。不同的手机型号有所不同。