如何从任何一点退出应用程序。

时间:2013-01-06 00:04:53

标签: android

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

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

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

我已经看了一遍,这是人们通常在登录/退出屏幕上遇到的一个非常常见的问题。我发现的解决方案都不适用于我。我知道这是可能的,因为我有这样的应用程序,例如Spotify。

有什么想法吗?谢谢。

3 个答案:

答案 0 :(得分: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();
    }
    

答案 1 :(得分:0)

在开始ServerMaintenanceActivity之前,请完成当前的操作,因此当您按下后退时,应将其从堆栈中删除。

//...
startActivity(i);
finish();

答案 2 :(得分:0)

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