Android:在ACTION_SHUTDOWN事件之前关闭网络电台。事件订单在ICS中更改

时间:2012-07-17 06:54:44

标签: android android-intent

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


Android:2.3


1)接收ACTION_SHUTDOWN
2)发送退出事件,睡眠5秒, LOG OUT SENT SUCCESSFULLY
3)数据网络无线电关闭事件。
4)设备断电。


Android:4.0.3


1)数据网络无线电关闭事件。
2)接收ACTION_SHUTDOWN
3)发送注销事件, LOG OUT FAIL As Network is down
在数据网络无线电关闭之前,有什么方法可以获得ACTION_SHUTDOWN吗?

3 个答案:

答案 0 :(得分:1)

它看起来不像香草Android行为。可能是您的设备制造商对关机过程进行了一些内部改进,以加快速度。

您可以在当前主分支的frameworks/base/services/java/com/android/server/pm/ShutdownThread.java#L296上看到如何处理关闭。

然而,作为移动应用程序开发人员,您不应该依赖于持续的网络连接。

答案 1 :(得分:0)

您是否尝试过使用服务?您可以注册一个正在运行的服务,这样当它收到onDestroy()时,您就知道您的应用程序正在被杀死并执行该注销请求。

只是一个想法。我不知道服务的onDestroy()是否早于网络调用而被调用,但我会试一试以防万一。

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