Подтвердить что ты не робот

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 перед отключением сети передачи данных?

4b9b3361

Ответ 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();
            }
        }
    }
}