如何优雅地关闭 Android 应用程序中的所有活动并关闭所有正在运行的线程?
Posted
技术标签:
【中文标题】如何优雅地关闭 Android 应用程序中的所有活动并关闭所有正在运行的线程?【英文标题】:How to gracefully shut down all activities and close all running threads in an Android app? 【发布时间】:2019-06-20 22:44:11 【问题描述】:目前,在我的每一项活动中,我都有这种方法:
private void registerReceiverClose()
Activity activity = this;
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("CLOSE_ALL");
broadcastReceiver = new BroadcastReceiver()
@Override
public void onReceive(Context context, Intent intent)
activity.finish();
;
registerReceiver(broadcastReceiver, intentFilter);
还有这个:
@Override
protected void onDestroy()
unregisterReceiver(broadcastReceiver);
super.onDestroy();
它们由以下注销按钮触发:
Button logout = findViewById(R.id.logout_button);
logout.setOnClickListener(click ->
Intent intent = new Intent("CLOSE_ALL");
this.sendBroadcast(intent);
);
我确定没有以正确的方式关闭的一件事是我有以下代码:
private static final ScheduledExecutorService pollingScheduledExecutor = Executors.newSingleThreadScheduledExecutor();
private static final Object lock = new Object();
private static ScheduledFuture<?> currentRunningTask;
public void longPoll()
synchronized (lock)
if (currentRunningTask != null)
currentRunningTask.cancel(true);
try
currentRunningTask = pollingScheduledExecutor.scheduleAtFixedRate(this, 0, 3, TimeUnit.SECONDS);
catch (Exception ignored)
public void request()
Thread requestThread = new Thread(this);
requestThread.start();
即使在我认为我应该退出后仍继续发出请求,这会导致服务器出错。
如何确保所有线程正常停止并且应用程序以正确的方式关闭?
【问题讨论】:
【参考方案1】:您可以将轮询代码包装在 Service 中。然后可以使用停止此服务
Intent intent = new Intent(MainActivity.this, MyService.class);
stopService(intent);
在服务内部,您可以覆盖onDestroy()
以清理资源。
【讨论】:
以上是关于如何优雅地关闭 Android 应用程序中的所有活动并关闭所有正在运行的线程?的主要内容,如果未能解决你的问题,请参考以下文章
stop tomcat web application 优雅地关闭所有 servlet 连接