如何创建 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>
我希望创建 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>