我想做很长的背景工作 此外,我希望能够随时通过用户更新通知来显示ui中的统计信息进度。
我在START_STICKY模式下启动服务,然后将其绑定到我的活动,并使用公共服务方法运行proccess。
一切顺利,直到我从最近的应用程序关闭我的应用程序。
它会破坏并重新启动正在运行的服务。
问题所在。 "我不希望我的正在运行的服务重新启动"
我希望我的服务能够在没有终止的情况下继续运行而无需重新启动。
我该怎么做我想做的事?
为什么操作系统重启正在运行的服务:/你
我尝试过START_NOT_STICKY,但它也关闭了服务。
答案 0 :(得分:1)
尝试使用前台服务:
在您开始服务的方法中:
Intent startIntent = new Intent(MainActivity.this, ForegroundService.class);
startIntent.setAction(Constants.ACTION.STARTFOREGROUND_ACTION);
startService(startIntent);
现在在onStartCommand()
:
if (intent.getAction().equals(Constants.ACTION.STARTFOREGROUND_ACTION)) {
Log.i(LOG_TAG, "Received Start Foreground Intent ");
Toast.makeText(this, "Service Started!", Toast.LENGTH_SHORT).show();
或者您可以尝试这样的事情:
来自onStartCommand()
的需要返回START_STICKY
覆盖您的服务onDestroy
方法:
@Override
public void onDestroy() {
super.onDestroy();
Log.i("EXIT", "ondestroy!");
Intent broadcastIntent = new Intent();
broadcastIntent.putExtra("broadcast.Message", "alarm, need to restart service");
sendBroadcast(broadcastIntent);
}
现在需要实现广播接收器:
public class RestarterBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i(SensorRestarterBroadcastReceiver.class.getSimpleName(), "Service Stops! Oooooooooooooppppssssss!!!!");
context.startService(new Intent(context, YourService.class));
}
}
答案 1 :(得分:1)
在Android 6+上,当用户从最近删除应用时,前台服务不会停止。您可以将此代码添加到onCreate()
:
final Intent launcherIntent = new Intent();
final PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, launcherIntent, 0);
final Notification.Builder builder = new Notification.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Test Notification")
.setWhen(System.currentTimeMillis())
.setContentIntent(pendingIntent);
final Notification notification;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
notification = builder.build();
}
else {
//noinspection deprecation
notification = builder.getNotification();
}
this.startForeground(NOTIFICATION_ID, notification);
在Android 6之前,当用户从最近删除任务时,服务总是被终止。除了在onTaskRemoved()
中干净地关闭外,你无能为力。
答案 2 :(得分:0)
check if service is running or not
if(!isBackgroundServiceRunning(BackgroundServices.class))
{
Intent intent = new Intent(this,BackgroundServices.class);
startService(intent);
}
private boolean isBackgroundServiceRunning(Class<?> service)
{
ActivityManager manager = (ActivityManager)(getApplicationContext().getSystemService(ACTIVITY_SERVICE));
if (manager != null)
{
for(ActivityManager.RunningServiceInfo info : manager.getRunningServices(Integer.MAX_VALUE))
{
if(service.getName().equals(info.service.getClassName()))
return true;
}
}
return false;
}