2015-09-16 2 views
0

Я хочу очистить таблицу на стороне сервера, чтобы удалить все данные, относящиеся к конкретному адресу mac, когда пользователь закрывает приложение. Поэтому я пытаюсь запустить класс Intentservice при вызове onDestroy(). В настоящее время, когда я закрываю приложение, onHandleIntent не вызывается, и ничего не происходит.Очистка базы данных на сервере при закрытии приложения

класс MainActivity

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
    WifiInfo wInfo = wifiManager.getConnectionInfo(); 
    String macAddress = wInfo.getMacAddress(); 

    JsonObject jsonObject = new JsonObject(); 
    jsonObject.addProperty("mac", macAddress); 

    System.out.println("JsonObject" + jsonObject); 

    String json = jsonObject.toString(); 

    Intent intent2 = new Intent(MainActivity.this, 
      ClearTable.class); 
    intent2.putExtra("json_mac", json); 
    startService(intent2); 
     } 

OnDestroy в MainActivity:

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
    WifiInfo wInfo = wifiManager.getConnectionInfo(); 
    String macAddress = wInfo.getMacAddress(); 

    JsonObject jsonObject = new JsonObject(); 
    jsonObject.addProperty("mac", macAddress); 

    System.out.println("JsonObject" + jsonObject); 

    String json = jsonObject.toString(); 

    Intent intent2 = new Intent(MainActivity.this, 
      ClearTable.class); 
    intent2.putExtra("json_mac", json); 
    startService(intent2); 

}

IntentService класс:

public class ClearTable extends IntentService{ 

    public ClearTable() { 
     super("IntentService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

     BufferedReader reader = null; 

     try { 
      String jSONString = intent.getStringExtra("json_mac"); 
      System.out.println("xyz The output of : doInBackground " 
        + jSONString); 
      URL myUrl = new URL(
        "https://serverside-apple.rhcloud.com/webapi/test"); 
      HttpURLConnection conn = (HttpURLConnection) myUrl 
        .openConnection(); 
      conn.setRequestMethod("POST"); 
      conn.setConnectTimeout(10000); 
      conn.setReadTimeout(10000); 
      conn.connect();    
      DataOutputStream wr = new DataOutputStream(
        conn.getOutputStream()); 
      // write to the output stream from the string 
      wr.writeBytes(jSONString); 
      wr.close();    
      System.out.println("xyz The output of getResponsecode: " 
      + conn.getResponseCode()); 

     } catch (IOException e) { 

      e.printStackTrace(); 

     } finally { 
      if (reader != null) { 
       try { 
        reader.close(); 

       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 

    } 

} 

Manifest:

<service android:name=".ClearTable" /> 
+0

'попытайтесь вызвать 'super.onDestroy()' в конце.' –

ответ

0

сделать действие (т.е. функции) на вашей стороне сервера контроллера (который обрабатывает запрос), чтобы очистить таблицы, которые вы хотите очистить и вызвать его с помощью отправки запроса через URL (который включает в себя значение поручая называть это действие)

+0

Но проблема в том, где я могу поместить код в приложение для Android вызовите это действие и узнайте, когда приложение закрывается. – MrPencil

+0

вместо того, чтобы поместить его в onDestroy, также называть его кнопкой выхода (или опцией) .., а также создать диалог, в который попсы, чтобы подтвердить выход, и на этом положительном действии вызвать его .., который максимизирует возможность вызова этой функции .. полагаясь на действие .. но в моем лучшем совете назовите его onStart() вместо этого, закрыв вызов его onStart() или вы можете использовать его при запуске и уничтожении ..просто проверьте, существуют ли данные или нет. Если есть, то звоните :) –

0

сначала: убедитесь, что вы действительно закрываете приложение во время тестирования, то есть нажатие домашней кнопки приостанавливает приложение «onPause()», а позже «onStop()», но не закрывает его "OnDestroy()". Посмотрите на графику в середине этой страницы. Android Activity Lifecycle (прокрутите вниз, пока не нажмете на картинку).

Чтобы действительно закрыть его, вам нужно нажать кнопку многозадачности (на современных телефонах для Android обычно есть спина и многозадачная кнопка рядом с кнопкой «домой») и проведите пальцем по экрану.

второй: попробуйте позвонить super.onDestroy() наконец

@Override

защищен недействительным OnDestroy() {

ваш код здесь идет

super.onDestroy() ;

}

+0

, но я не хочу очищать таблицы, когда приложение идет в фоновом режиме. И неважно, ставил ли я свой код после 'super.onDestroy();' или раньше. – MrPencil

+0

Единственное, что я вижу на данный момент, это то, что вы называете 'super (« IntentService »);' вместо 'super (" ClearTable ");' –

+0

в моем проекте я ставлю 'Log.d (" mydebug »,« onDestroy() »);' в методе onDestroy, и это было каждый раз, когда я вручную закрыл приложение на Android 5.0. Таким образом, мы можем видеть, что если он не вызван onDestroy(), или что-то еще –

0

Как documentation также говорит onDestroy() вызова не гарантируется, поэтому, если вы хотите, чтобы убедиться, что ваша функция называется необходимо реализовать onPause() метод (даже жестким это будет причиной того, что ваши данные будет удаляться чаще, но это единственный гарантированный способ.)

+0

Проблема wih 'onPause()' и 'onStop()' в том, что таблицы очищаются, даже когда приложение идет в фоновом режиме или когда действие изменяется. – MrPencil

+0

'В документации также говорится, что вызов onDestroy() не гарантируется' звонок не гарантирует, когда 'Пока приложение находится в фоновом режиме, а ОС убивает процесс приложения для освобождения памяти'. Нажатие кнопки «Назад» для выхода всегда вызывает функцию onDestroy(). –

+0

Моя другая идея заключалась бы в том, что ваш сервер отправляет запрос на телефон, и если телефон не отвечает, вы можете удалить данные ...: или просто удалить его через 5-10-15 минут – bendaf

Смежные вопросы