我有以下代码,我用它来测试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;
}
}
答案 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
的可用对象应用程序将崩溃。