2016-11-22 15 views
1

私は、Webviewが組み込まれたアンドロイドアプリケーションと、このアプリケーションが接続するウェブサイトを持っています。ユーザにログイン(またはログアウト)すると、セッションデータは永久メモリに保存される前に約1〜2分かかるようです。Android Force Update Webviewセッション

この結果、ログイン(またはログアウト)後にすぐにアプリがオフになると、セッションデータが永続的にならず、後でアプリを再び開くと前のセッションに戻ります。

キャッシュの問題のように見えますが、解決策を見てきましたが、セッションデータを強制的に更新する方法が見つからないようで、誰かが私に指摘できたらうれしいです正しい方向に。

答えて

0

はロリポップで廃止されたセッションの使用を終了するには、代わりにCookieManagerインスタンス上flushを呼び出します。これにより、クッキーをメモリに保存して永久保存します。これはまだ非同期的に行われているため、実行することはできません。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); 
} 
} 

の1つの画面は、ログイン活動へのWebViewクラス

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); 

を追加します。

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); 
} 

} 

私は私の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に次のコードを使用して終了しました。この

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

私はこれが関連しているとは思わない。おそらく、私は自分自身を明らかにしなかったし、主な活動以外にも(ウェブビューで)私は他の活動を持たず、ログインとセッションの処理はウェブサイトによって行われ、アプリケーションはそれを扱わず、意味する。セッションデータは既にwebviewによって保存されています。私はそれを自分で強制的に保存できるようにする方法を知る必要があります。 –

+0

私はこれが助けることができると信じていますhttp://stackoverflow.com/questions/2566485/webview-and-cookies-on-android –