2016-11-22 2 views
1

У меня есть приложение для Android с встроенным Webview и веб-сайтом, к которому это приложение подключается. При входе в систему (или выходе из системы) пользователю данные сеанса, по-видимому, занимают около минуты или две, прежде чем они будут сохранены в постоянной памяти.Android Force Update Webview Session

Результатом этого является то, что если после входа в систему (или выхода из системы) приложение немедленно отключается, данные сеанса не становятся постоянными, и открытие приложения снова позже возвращается к предыдущему сеансу.

Это похоже на какую-то проблему с кешированием, я искал решение, но я не могу найти способ заставить данные сеанса обновления, я был бы признателен, если бы кто-нибудь мог указать мне в правильном направлении.

ответ

0

Я закончил с использованием следующего кода сеанса в моей JavascriptInterface

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { 
     //Not sure if this part works haven't tested it yet 
     CookieSyncManager sm = CookieSyncManager.createInstance(context); 
     sm.sync(); 
    } else { 
     cookies.flush(); 
    } 

CookieSyncManager является устаревшим в леденец, вызовите flush на CookieManager например вместо этого. Это позволит сохранить файлы cookie в памяти на постоянное хранилище. Обратите внимание, что это все еще выполняется асинхронно, поэтому вы не можете запустить его onDestroy(), это все еще занимает пару секунд.

Я положил это в функцию @JavascriptInterface, которая вызывается javascript всякий раз, когда пользователь входит в систему или выходит из системы и, похоже, работает достаточно хорошо.

0

Рабочий пример:

public class SessionManager { 

    public void setPreferences(Context context, String key, String value) { 

     SharedPreferences.Editor editor = context.getSharedPreferences("Androidwarriors", Context.MODE_PRIVATE).edit(); 
     editor.putString(key, value); 
     editor.commit(); 

    } 


    public String getPreferences(Context context, String key) { 

     SharedPreferences prefs = context.getSharedPreferences("Androidwarriors", Context.MODE_PRIVATE); 
     String position = prefs.getString(key, ""); 
     return position; 
    } 
} 

Например заставка, один экран приложения

public class Splash extends AppCompatActivity { 
SessionManager manager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_splash); 
    manager=new SessionManager(); 

    // METHOD 1 

    /****** Create Thread that will sleep for 3 seconds *************/ 
    Thread background = new Thread() { 
     public void run() { 

      try { 
       // Thread will sleep for 3 seconds 
       sleep(3*1000); 

       // After 5 seconds redirect to another intent 
       String status=manager.getPreferences(Splash.this,"status"); 
       Log.d("status",status); 
       if (status.equals("1")){ 
        Intent i=new Intent(Splash.this,MainActivity.class); 
        startActivity(i); 
       }else{ 
        Intent i=new Intent(Splash.this,LoginActivity.class); 
        startActivity(i); 
       } 


       //Remove activity 
       finish(); 

      } catch (Exception e) { 

      } 
     } 
    }; 

    // start thread 
    background.start(); 


} 

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    Intent intent = new Intent(Intent.ACTION_MAIN); 
    intent.addCategory(Intent.CATEGORY_HOME); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//***Change Here*** 
    startActivity(intent); 
    finish(); 
    System.exit(0); 
} 
} 

Добавить в регистрационной деятельности

manager.setPreferences(LoginActivity.this, "status", "1"); 
    String status=manager.getPreferences(LoginActivity.this,"status"); 
    Log.d("status", status); 
    // Toast.makeText(getBaseContext(), "Bem-Vindo", Toast.LENGTH_LONG).show(); 
    Intent i = new Intent(LoginActivity.this, Web.class); 
    startActivity(i); 

на классе Webview

public class Web extends AppCompatActivity { 
//private WebView webView; 

SessionManager manager; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_web_view); 

    manager = new SessionManager(); 



    // webView = (WebView) findViewById(R.id.webView); 
    WebView webView = new WebView(this); 
    final WebSettings settings = webView.getSettings(); 
    webView.getSettings().setJavaScriptEnabled(true); 
    settings.setJavaScriptEnabled(true); 
    settings.setAppCacheEnabled(false); 
    settings.setPluginState(WebSettings.PluginState.ON); 
    setContentView(webView); 
    webView.setWebViewClient(new WebViewClient()); 
    webView.loadUrl("link"); 

} 




@Override 
public void onBackPressed() { 
    super.onBackPressed(); 

    Intent intent = new Intent(Intent.ACTION_MAIN); 
    intent.addCategory(Intent.CATEGORY_HOME); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//***Change Here*** 
    startActivity(intent); 
    finish(); 
    System.exit(0); 
} 

} 

Чтобы закрыть использовать этот

manager.setPreferences(Web.this, "status", "0"); 
      finish(); 
+0

Я не считаю это актуальным. Возможно, я не сделал себе ясности, кроме того, основной вид деятельности (с веб-просмотром), у меня нет других действий, вся обработка входа и сеанса выполняется на веб-сайте, приложение не имеет никакого отношения к этому, и это не предназначены для. Данные сеанса уже хранятся в веб-просмотре. Мне просто нужно знать, как я могу принудительно сохранить его сам. –

+0

Я считаю, что это может помочь вам http://stackoverflow.com/questions/2566485/webview-and-cookies-on-android –