20

ユーザーがデバイスの電源をオフにしたときにサーバーにログアウトを送信していました。2.3および4.0.3のイベントの順序は次のとおりです。したがって、ログアウトは失敗します。
デバイス:Samsung Galaxy s2


Android:2.3


1)ACTION_SHUTDOWNを受信します
。2)ログアウトイベントを送信し、5秒間スリープし、ログアウトに成功
しました。3)データネットワーク無線オフイベント。
4)デバイスの電源を切ります。


Android:4.0.3


1)データネットワーク無線オフイベント。
2)ACTION_SHUTDOWNを受信します
。3)ログアウトイベントを送信します。ネットワークがダウンしているため、LOGOUTFAILになります。
データネットワーク無線をオフにする前にACTION_SHUTDOWNを取得する方法はありますか?

4

3 に答える 3

1

通常の Android の動作とは異なります。デバイスの製造元が、シャットダウン プロセスを高速化するために内部的な改善を行った可能性があります。

現在のマスター ブランチのFrameworks/base/services/java/com/android/server/pm/ShutdownThread.java#L296で、シャットダウンがどのように処理されるかを確認できます。

ただし、モバイル アプリケーションの開発者として、常時ネットワーク接続に頼るべきではありません。

于 2012-10-24T20:02:46.483 に答える
0

次のように、シャットダウンのブロードキャストを受信するサービスを作成します。

public class MyAppShutdown extends BroadcastReceiver{
    private static final String TAG = "MyAppShutdown";
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Log.v(TAG, "onReceive - ++ ENTER ++");
        if (intent != null && intent.getAction().equals(Intent.ACTION_SHUTDOWN)){
            Log.v(TAG, "onReceive - ***] SHUTDOWN [***");
            // perhaps send a broadcast to your app via intent to perform a log out.
            Intent intent = new Intent();
            intent.addAction("intent.myapp.action.shutdown");
            sendBroadcast(intent);
        }
        Log.v(TAG, "onReceive - ++ LEAVE ++");        
    }
}

で、このフラグメントを以下のタグAndroidManifest.xml内に埋め込みます。<application>

<receiver android:name=".MyAppShutdown">
    <intent-filter>
         <action android:name="android.intent.action.SHUTDOWN"/>
    </intent-filter>
</receiver>

アプリのアクティビティから、インテント用の適切なフィルターを使用してブロードキャスト レシーバーを登録します。

public class myApp extends Activity{
    private myAppBroadcastRcvr myAppRcvr = new myAppBroadcastRcvr();
    @Override
    public void onCreate(Bundle savedInstanceState){
        IntentFilter filter = new IntentFilter();
        filter.addAction("intent.myapp.action.shutdown");
        registerReceiver(myAppRcvr, filter);
    }
    // Perhaps you have this
    private void LogOff(){
    }
    class myAppBroadcastRcvr extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent){
            if (intent.getAction().equals("intent.myapp.action.shutdown")){
                 LogOff();
            }
        }
    }
}
于 2012-07-26T01:02:20.467 に答える
0

そのためにサービスを使用してみましたか?onDestroy() を受信したときに、アプリが強制終了されたことを認識し、そのログアウト リクエストを実行できるように、常時実行中のサービスを登録できます。

ただのアイデア。ネットワークがダウンする前にサービスの onDestroy() が呼び出されるかどうかはわかりませんが、念のため試してみます。

于 2012-07-25T13:01:58.640 に答える