如何创建 Android 服务一直工作

How can I create Android service all time working

我希望创建 Android 服务一直工作到我停止它的时候。重启设备、垃圾收集器等不会影响它的工作。请给我最好的例子。

您需要有一个 BroadcastReceiver 来侦听 BOOT_COMPLETED 广播 Intent 并在设备启动时启动您的 Service

你的 Service 应该 return START_STICKY 来自 onStartCommand()。如果 Android 出于任何原因决定终止它,这将重新启动您的 Service

你无法阻止 Android 杀死你的 Service,如果它想的话。您所能做的就是尝试确保您的 Service 在被杀死后重新启动。

此外,如果您的用户强制停止您的应用程序,您的 Service 将被停止并且不会再次自动启动。在这种情况下,用户将需要再次启动您的应用,以便您重新启动 Service.

  • 您必须 return START_STICKY 在方法 onStartCommand() 中(或者只创建 Foreground Service 在状态栏中有通知,即使内存不足,它也会一直 运行,例如:音乐播放器使用 forceground 服务确保音乐始终播放)
  • 设备重启后,您必须broastcat此事件并启动您的服务。
  • 非root设备中,您的服务可能会被其他应用程序(例如:Cleanmaster)停止,但是如果您return START_STICKY,会自动重启。对于非 root 设备,当用户 强制停止 您的应用程序(在应用程序管理器设置中)时,您的服务将停止。为防止用户强行停止您的应用程序,您可以请求用户授予您的应用程序 Device Administration 权限。
  • root 设备 中,无法阻止 CleanMaster Force 停止您的应用程序,即使您 return START_STICKY 或授予设备管理权限,因为此应用程序可能已授予超级用户权限许可。

为此,您必须设置一个 BroadcastReciver 来接收启动完成。在该接收器中启动您想要的服务,下面是确切的代码。

服务class

public class BroadCastService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(),R.raw.tone);
        mediaPlayer.start();
        return Service.START_STICKY;
    }
}

BroadCastReciver class

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent startServiceIntent = new Intent(context, BroadCastService.class);
        context.startService(startServiceIntent);
   }
}

内部清单

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
// add following in <application>
<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>