0

创建了一个IntentService并放入for loop方法onHandleIntent。每次我关闭应用程序(从最近的不强制关闭中删除)它都会停止。但是onDestroy没有叫。我也尝试过不同的设备。我不认为这是内存不足的问题。
那么服务是否意味着仅在应用程序处于前台时才使用?
当用户关闭应用程序时,我必须在主线程的后台做一些任务并且服务关闭。
这是我的示例代码

 public class MyIntentService extends IntentService {


    private static final String TAG = "MyIntentService";

    public MyIntentService() {
        super("MyIntentService");
    }


    @Override
    protected void onHandleIntent(Intent intent) {

        for (int i = 0; i < 30; i++) {
            Log.d(TAG, "onHandleIntent:   " + i);
            try {
                Thread.sleep(600);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: ");
    }
}

refs:即使应用程序关闭,如何保持 IntentService 运行?
服务在应用程序关闭时重新启动 - START_STICKY

4

2 回答 2

1

关闭应用程序后使用以下代码重新启动服务

public class MyService extends Service {

@Override
public int onStartCommand(final Intent intent, final int flags,
                          final int startId) {
    super.onStartCommand(intent, flags, startId);
    return Service.START_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    Intent restartService = new Intent(getApplicationContext(),
            this.getClass());
    restartService.setPackage(getPackageName());
    PendingIntent restartServicePI = PendingIntent.getService(
            getApplicationContext(), 1, restartService,
            PendingIntent.FLAG_ONE_SHOT);
    AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 100, restartServicePI);
    Toast.makeText(this, "onTaskRemoved", Toast.LENGTH_SHORT).show();
    super.onTaskRemoved(rootIntent);
}}

上述方法onTaskRemoved在 100 毫秒后重新启动您的服务。

于 2017-09-20T12:12:03.083 回答
0
@Override
    public void onTaskRemoved(Intent rootIntent) {
}

当应用程序从最近删除时,将调用上述方法。但不会有上下文。因此,您需要在上下文可用时完成您的任务。所以把代码放在里面,

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    
   //do your operations
    return START_REDELIVER_INTENT;
}

请记住,在 onStartCommand 中,您应该返回 START_REDELIVER_INTENT 或 START_STICKY。你可以从这里得到不同。

还有一件事,只有当 startService 从代码的任何地方调用一次时,onStartCommand 才会自动撤销。

因此,通过调用运行服务

startService(new Intent(context, serviceName.class));

如果服务没有停止,以下代码 onStartCommand 将被定期撤销。

于 2017-09-20T12:21:58.217 回答