2012-07-17 1 views
20

사용자가 기기의 전원을 껐을 때 내 서버에 로그 아웃했습니다. 2.3 및 4.0.3의 이벤트 순서는 다음과 같습니다. 이제 로그 아웃이 실패했습니다.
장치 : 삼성 갤럭시 S2Android : ACTION_SHUTDOWN 이벤트 이전의 네트워크 라디오 꺼짐. ICS에서 변경됨


안드로이드 : 2.3


1) 수신 ACTION_SHUTDOWN
2) 5 초에 대한 로그 아웃 이벤트, 잠을 보내기는 LOG는 OUT
3) 데이터 성공적으로 전송 네트워크 라디오 꺼짐 이벤트.
4) 장치 전원이 꺼졌습니다.


안드로이드 : 4.0.3


1) 데이터 네트워크 라디오 오프 이벤트입니다.
2) 수신 ACTION_SHUTDOWN
3) 로그 아웃 이벤트, 로그 아웃 FAIL 네트워크가 다운 된 경우.
데이터 네트워크 라디오가 꺼지기 전에 ACTION_SHUTDOWN을 사용하면 어떨까요?

답변

0

서비스를 사용해 보셨습니까? onDestroy()를 수신하면 앱이 종료되고 해당 로그 아웃 요청을받을 수 있도록 항상 실행중인 서비스를 등록 할 수 있습니다.

아이디어 만 있습니다. 서비스의 onDestroy()가 네트워크보다 먼저 호출되는지 여부는 알 수 없지만, 경우에 대비하여 시도해 보겠습니다.

0

과 같이 종료에 대한 방송을 수신하는 서비스 만들기 : 당신의 AndroidManifest.xml에서

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 ++");   
    } 
} 

<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(); 
      } 
     } 
    } 
} 
+0

Oklet은 LogOff()를 호출한다고 가정합니다. 플랫폼 네트워크 라디오가 꺼져 있기 때문에 데이터를 보낼 수 없습니다 !!! – NitZRobotKoder

+0

예! 나는 당신의 질문을 다시 읽은 후 다소 실감했다. 놀랐다. 안드로이드가 주변을 바꿨다고 믿을 수 없다. 라디오가 마지막으로 꺼져 있다고 생각했을 것이다. ... – t0mm13b

+0

thats Ok !! 그래, 왜 행동이 바뀌 었는지 이상해 !! – NitZRobotKoder

1

바닐라 Android 동작처럼 보이지 않습니다. 귀하의 장치 제조업체가 속도를 내려면 시스템 종료 프로세스를 내부적으로 개선했을 수도 있습니다.

현재 마스터 분기에서 frameworks/base/services/java/com/android/server/pm/ShutdownThread.java#L296으로 시스템 종료를 처리하는 방법을 확인할 수 있습니다.

그러나 모바일 응용 프로그램 개발자는 지속적인 네트워크 연결에 의존해서는 안됩니다.

관련 문제