您需要在应用程序类中启动一个服务,以便始终运行。
如果这样做,您的服务将始终运行。即使用户从任务管理器中终止了您的应用程序或强制停止了您的应用程序,它也将重新开始运行。
创建一个服务:
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);
}
}
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
startService(new Intent(this, YourService.class));
}
}
android:name=".App"
<service android:name=".YourService"/>
如果API级别为28或更高,则还需要在“清单”标签中添加此权限请求:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
更新
在安卓Oreo之后,谷歌引入了一些后台限制。因此,上述解决方案可能不起作用。当用户从任务管理器中杀死您的应用程序时,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厂商
不幸的是,一些OEM厂商(如小米、一加、三星、华为等)由于提供更长的电池续航时间而限制后台操作。对于这些OEM厂商,目前没有合适的解决方案。用户需要允许一些特殊权限,这些权限是针对OEM厂商特定的,或者他们需要将您的应用程序添加到设备设置中的白名单应用程序列表中。您可以从https://dontkillmyapp.com/获取更详细的信息。
如果后台操作对您来说是必须的,您需要向用户解释为什么您的功能无法正常工作以及他们如何通过允许这些权限来启用您的功能。我建议您使用AutoStarter库(https://github.com/judemanutd/AutoStarter),以便从您的应用程序轻松重定向用户至权限页面。
顺便说一下,如果您需要运行一些周期性任务而不是持续的后台任务,最好看一下WorkManager(https://developer.android.com/topic/libraries/architecture/workmanager)。
在一些移动设备上,例如我的小米Redmi 3(MIUI系统),您可以将特定应用程序添加到列表中,在任务管理器中终止应用程序时,该应用程序不会停止(它会停止,但会重新启动)。
只需转到“设置”>“权限”>“自启动”,即可实现此功能。