关闭应用后,Android服务即停止

时间:2017-09-20 12:07:04

标签: android multithreading service intentservice android-recents

创建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: ");
    }
}

参考文献:How to keep an IntentService running even when app is closed? {
{3}}

2 个答案:

答案 0 :(得分: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毫秒后重启您的服务。

答案 1 :(得分: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。你可以得到差异from here.

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

因此,请致电

运行服务

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

如果服务没有停止,上面的代码onStartCommand将被定期撤销。