0

サーバーにアクセスするアプリケーションがあります。データのためにサーバーにアクセスする多くのアクティビティがあります。アプリケーションのさまざまなポイントで、2つのことを確認するための簡単なチェックを行います。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、現在のものを終了します。そのため、[戻る]を押すと、スタックから削除されます。

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