如何创建一个始终运行的后台服务?

use*_*811 9 java service android android-activity

我的问题是如何创建一个始终运行的后台服务.我创建了一个IntentService,只要应用程序正在运行,它就会在后台运行.但是,当应用程序被杀死时,服务也会消失.我想要创建的是创建一个始终运行和发布通知的后台服务.(类似于whatsapp,facebook或任何其他类似的应用程序.)

单击通知时,它也应该启动应用程序.

我该怎么做?

Pre*_*Rao 11

最好这样做是创建自定义服务,扩展您的服务而不是意图服务.并在您的服务中启动一个单独的线程.启动应用程序启动服务一个更重要的是这不要将它绑定到任何对象导致服务将被杀死一旦您的对象被销毁.然后onStartCommand()方法返回START_STICKY我将为您提供示例实现.

public class CustomService extends Service {

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    return START_STICKY;
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    // TODO Auto-generated method stub
     Intent restartService = new Intent(getApplicationContext(),
                this.getClass());
        restartService.setPackage(getPackageName());
        PendingIntent restartServicePI = PendingIntent.getService(
                getApplicationContext(), 1, restartService,
                PendingIntent.FLAG_ONE_SHOT);

        //Restart the service once it has been killed android


        AlarmManager alarmService = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
        alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() +100, restartServicePI);

}

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();

    //start a separate thread and start listening to your network object
}
Run Code Online (Sandbox Code Playgroud)

}

一旦被杀死,onTaskRemoved会在100毫秒后重启您的服务.START_STICKY在kitkat中无效.你必须实现onTAskRemoved.还有一件事,如果用户进入应用程序设置并停止服务,则无法重新启动它


bus*_*lee 4

您必须使用启动命令启动服务。并且必须重写service中的onStartCommmand函数:

 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("LocalService", "Received start id " + startId + ": " + intent);
        // We want this service to continue running until it is explicitly
        // stopped, so return sticky.
        return START_STICKY;
    }
Run Code Online (Sandbox Code Playgroud)

START_STIKY意味着服务将自动重新启动(http://developer.android.com/reference/android/app/Service.html#START_STICKY

如果您使用bindService函数而不是startCommand,您的服务将停止,然后所有绑定的活动都会停止。

更重要的是,如果您想在启动设备后自动启动服务,则必须实现BroadcastReceiver接收ACTION_BOOT_COMPLETED意图并处理此事件以启动服务。