20

当用户在设备上关闭电源时,我正在向我的服务器发送注销。2.3和 4.0.3中的事件顺序如下。所以现在注销失败。
设备:三星 Galaxy s2


安卓:2.3


1) 接收 ACTION_SHUTDOWN
2) 发送 Logout 事件,休眠 5 秒,LOG OUT SENT SUCCESSFULLY
3) Data Network Radio off 事件。
4)设备断电。


安卓:4.0.3


1) 数据网络无线电关闭事件。
2) 接收 ACTION_SHUTDOWN
3) 发送 Logout 事件,LOG OUT FAIL As Network is down
有什么办法可以在数据网络无线电关闭之前获得 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 回答