当用户在设备上关闭电源时,我正在向我的服务器发送注销。 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吗?
答案 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();
}
}
}
}