Android: сетевое радио выключено перед ACTION_SHUTDOWN событием. Заказ изменений изменен в ICS
Я отправлял выход на свой сервер, когда пользователь отключил питание устройства. Порядок событий в 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) Отправить событие выхода из системы, ВЫЙТИ ВНЕШНИЙ ВИД, если сеть опущена.
В любом случае, чтобы получить ACTION_SHUTDOWN перед отключением сети передачи данных?
Ответы
Ответ 1
Это не похоже на поведение ванильного Android. Может быть, ваш производитель устройств сделал некоторые внутренние улучшения в процессе выключения, чтобы ускорить его.
Вы можете видеть, как выключение выполняется при frameworks/base/services/java/com/android/server/pm/ShutdownThread.java # L296 на текущей ведущей ветке.
Однако в качестве разработчика мобильных приложений вы не должны полагаться на постоянное сетевое подключение.
Ответ 2
Вы пытались использовать Сервис для этого? Вы можете зарегистрировать постоянно действующий сервис, чтобы, когда он получает onDestroy(), вы знаете, что ваше приложение убито и выполняет этот запрос выхода.
Просто идея. Я не знаю, вызвана ли услуга onDestroy() раньше сети, но я бы попробовал на всякий случай.
Ответ 3
Создайте службу, которая получает широковещательную передачу для выключения следующим образом:
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();
}
}
}
}