如何优雅地关闭 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 连接

如何在 Netty 中的 ssl 握手之前优雅地关闭频道?

如何优雅地关闭 ASP.Net(非核心)

如何优雅地终止正在运行的Spark Streaming程序

关闭 Windows 控制台时如何优雅地关闭 Java 应用程序?

如何优雅地关闭异步服务器套接字? C#