0

我有一个访问服务器的应用程序。我有许多访问服务器以获取数据的活动。在应用程序的各个点,我做了一个简单的检查来验证两件事,1)有互联网连接和 2)服务器没有处于维护模式或关闭。如果是,我会显示一个活动,详细说明为什么以及何时服务器将被备份。

当用户在此“服务器已关闭”活动中单击返回时,我需要退出应用程序。我尝试了以下代码/意图来调用“服务器关闭”活动,但它不起作用。

Intent i = new Intent(this, ServerMaintenanceActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);

我已经查看了所有内容,这是人们通常在登录/注销屏幕上面临的一个非常常见的问题。我找到的解决方案都不适合我。我知道这是可能的,因为我有一些应用程序可以做到这一点,例如 Spotify。

有任何想法吗?谢谢。

4

3 回答 3

2

每当您开始一项活动时,您都可以ResultReceiver在全局帮助程序类中创建新活动,然后将其放入列表中。然后,在您的通知活动中(告诉用户“服务器已关闭”),覆盖onDestroy()并发送请求以完成其他活动。

例如:

  • Helper班级:

    public static final int REQUEST_FINISH = 1;
    
    private static final List<ResultReceiver> mClients = new ArrayList<ResultReceiver>();
    
    public static void registerClient(ResultReceiver receiver) {
        mClients.add(receiver);
    }
    
    public static void unregisterClient(ResultReceiver receiver) {
        mClients.remove(receiver);
    }
    
    public static void finishApp() {
        for (ResultReceiver client : mClients)
            client.send(REQUEST_FINISH, null);
    }
    
  • 其他活动:

    private ResultReceiver mCommandHandler;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        // ...
    
        mCommandHandler = new ResultReceiver(null) {
    
            @Override
            public void onReceiveResult(int resultCode, Bundle resultData) {
                if (resultCode == Helper.REQUEST_FINISH) {
                    // do some other stuffs...
    
                    finish();
                }
            }
        };
    
        Helper.registerClient(mCommandHandler);
    }// onCreate()
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Helper.unregisterClient(mCommandHandler);
    }
    
  • 通知活动:

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Helper.finishApp();
    }
    
于 2013-01-06T00:24:58.690 回答
0

删除 Intent.FLAG_ACTIVITY_NEW_TASK。如果您使用 NEW_TASK 标志启动新活动,它将启动新任务。您不想要新任务,您想要清理所有当前任务活动堆栈。所以删除 FLAG_ACTIVITY_NEW_TASK。PS 以这种方式关闭所有活动不是最好的解决方案,ResultReceiver 更好。

于 2013-01-06T00:40:29.950 回答
0

在开始之前ServerMaintenanceActivity,完成当前的,所以当你按下 Back 时,它应该从堆栈中删除。

//...
startActivity(i);
finish();
于 2013-01-06T00:09:31.610 回答