如何创建Android服务的所有工作

时间:2016-03-14 16:35:31

标签: android android-service

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

3 个答案:

答案 0 :(得分:2)

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

您的Service应该从START_STICKY返回onStartCommand()。如果Android出于任何原因决定将其杀死,则会重新启动Service

如果想要,您无法阻止Android杀死Service。您所能做的就是尽量确保Service在被杀后重新启动。

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

答案 1 :(得分:2)

  • 您必须在方法 onStartCommand ()中返回 START_STICKY (或者只是在状态栏中显示通知创建Foreground Service,即使网址较低,它也会一直运行记忆,例如:音乐播放器使用forceground服务以确保音乐始终播放)
  • 设备重新启动后,您必须 broastcat 此活动并启动您的服务。
  • 非root设备中,您的服务可以由其他应用程序停止(例如:Cleanmaster),如果您返回START_STICKY,它将自动重启。使用非root设备时,当用户强制停止您的应用程序时(在应用程序管理器设置中),您的服务将停止。为了防止用户强行停止您的应用,您可以向您的应用请求用户授予Device Administration权限。
  • rooted device 中,即使您返回START_STICKY或授予设备管理,也无法阻止CleanMaster Force停止您的应用,因为此应用可能已授予超级用户权限。

答案 2 :(得分:1)

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

服务类

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类

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

在Manifest中

<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>