Android:即使应用程序被杀,也要保持asynctask

时间:2017-07-07 05:59:36

标签: android android-asynctask

我有以下代码,我用它来测试asynctask的生命周期。我想做的是即使应用程序被用户强行关闭,也要让asynctask完成。它显示一个通知,每秒递增一次进度。从片段调用asynctask。但是,当我通过按下所有应用程序强制终止应用程序然后将其刷掉时,通知会停止并且不再增加。请参阅下面的代码。

是这种情况还是我做错了什么?

另外,我使用asynctask的原因是因为我希望允许用户尽可能取消任务。我相信这不能用IntentService完成吗? (纠正我,如果我错了)。

感谢任何帮助。

更新:我正在按照@John Wick和@Abishek的建议尝试前台服务。但是,我无法以我想要的方式停止服务。当我点击停止时,循环继续并且不会停止。

公共类ForegroundService扩展了服务{

    boolean isCancelled = false;

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        if (intent.getAction().equals("Start")) {
            Log.d("Action", "Start");
            Intent notificationIntent = new Intent(this, MainActivity.class);
            notificationIntent.setAction("Start");
            notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

            Intent closeIntent = new Intent(this, ForegroundService.class);
            closeIntent.setAction("Stop");
            PendingIntent pCloseIntent = PendingIntent.getService(this, 0, closeIntent, 0);

            Bitmap icon = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);

            NotificationManagerCompat manager = (NotificationManagerCompat.from(this));
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this);

            builder.setContentTitle("Truiton Music Player");
            builder.setTicker("Truiton Music Player");
            builder.setContentText("My Music");
            builder.setSmallIcon(R.mipmap.ic_launcher);
            builder.setLargeIcon(Bitmap.createScaledBitmap(icon, 128, 128, false));
            builder.setContentIntent(pendingIntent);
            builder.addAction(android.R.drawable.ic_media_pause, "Stop", pCloseIntent);

            startForeground(1, builder.build());
            for (int i = 0; i < 10; i++) {
                Log.d("Service", String.valueOf(i));
                builder.setProgress(9, i, false);

                if (isCancelled) {
                    builder.setContentTitle("Cancelled");
                    builder.setContentText("");
                    builder.setProgress(0, 0, false);
                    builder.mActions.clear();
                    manager.notify(1, builder.build());
                } else {
                    if (i == 9) {
                        builder.setContentTitle("Done");
                        builder.setContentText("");
                        builder.setProgress(0, 0, false);
                        manager.notify(1, builder.build());
                    } else {
                        manager.notify(1, builder.build());
                    }
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }

            stopForeground(true);
        } else {
            Log.d("Action", "Start");
            isCancelled = true;
            stopForeground(true);
            stopSelf();
        }

        return START_STICKY;
    }


}

3 个答案:

答案 0 :(得分:1)

即使应用已关闭,您也需要使用Foreground Service才能使其正常运行。有关演示实现,请参阅此链接。

http://www.truiton.com/2014/10/android-foreground-service-example/

答案 1 :(得分:1)

这里你需要的是服务,是的,当你不再需要它时可以停止它,相比AysncTask的优势就是当你从任务管理器终止你的应用程序时,你的服务不会受到影响。

要停止服务,您需要致电

stopService(new Intent(// Service));

现在,如果您想显示更新计数器的通知,请使用前台服务。

https://developer.android.com/guide/components/services.html#Foreground

答案 2 :(得分:0)

即使应用程序被杀,您仍然可以保留asynctask但是当doInBackground工作完成且onPostExecute方法工作时,您需要context的可用对象应用程序将崩溃。