我的问题是如何创建一个始终运行的后台服务。我创建了一个IntentService,只要应用程序正在运行,它就会在后台运行。但是,当app被杀死时,服务也会消失。我想要创建的是创建一个始终运行和发布通知的后台服务。 (类似于whatsapp,facebook或任何其他类似的应用程序。)
点击通知后,它也应该启动应用程序。
我该怎么做?
答案 0 :(得分: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
}
}
onTaskRemoved一旦被杀死,就会在100毫秒后重启您的服务。 START_STICKY在kitkat中无效。你必须实现onTAskRemoved。还有一件事,如果用户进入应用程序设置并停止服务,则无法重新启动它
答案 1 :(得分:3)
您必须使用start命令启动服务。并且您必须在服务中重写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;
}
START_STIKY
表示服务将自动重启(http://developer.android.com/reference/android/app/Service.html#START_STICKY)
如果您使用bindService函数而不是startCommand,您的服务将停止,然后所有绑定的活动都会关闭。
如果您想在启动设备后自动启动服务,则必须实现BroadcastReceiver
以接收ACTION_BOOT_COMPLETED
意图并处理此事件以启动服务。
答案 2 :(得分:0)
只要您的活动在附近,以下情况就会发生。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
不幸的是,当您的应用程序被杀死且设备资源耗尽时,它会将其终止
但是,如果您希望将服务保持运行数天,请确保您在前台运行服务。